home *** CD-ROM | disk | FTP | other *** search
/ Freelog 22 / freelog 22.iso / BAS / Graphism / Chaos / data1.cab / Beispieldateien / Formulas / Compiler / dmj.cfm < prev    next >
Text File  |  2000-10-04  |  296KB  |  12,000 lines

  1. comment {
  2.   dmj-pub.ufm 2.1
  3.   Fractal types for Ultra Fractal 2
  4.   by Damien M. Jones
  5.   April 2, 2000
  6.  
  7.   For more information about this formula collection,
  8.   please visit its home page:
  9.   
  10.       http://www.fractalus.com/ultrafractal/dmj-pub-uf.htm
  11.  
  12.   Many of these are based on traditional fractal types.
  13.   They have been included here with my own peculiar
  14.   "twists".
  15. }
  16.  
  17.  
  18. dmj-Bifurcation {
  19. //
  20. // This is a bifurcation rendering engine. You can use this
  21. // to produce bifurcation diagrams similar to FractInt's.
  22. // For best results, use the bifurcation coloring. It's
  23. // specifically tuned to work with this formula.
  24. //
  25. // Note: Because this is pixel-oriented instead of column-
  26. // oriented, this renders much slower than FractInt. Also,
  27. // plots are resolution-dependent. They are suitable for
  28. // exploration of formulas, but you may have difficulty
  29. // rendering them at large sizes. Don't say I didn't warn you.
  30. //
  31. real z1;
  32. parameter real start;
  33. real r;
  34. real zmin;
  35. real zmax;
  36. int inside;
  37. int counter;
  38. parameter int type;
  39. parameter real power;
  40. parameter real filter;
  41.  
  42.     void init(void)
  43.     {
  44.         z1 = start;
  45.         r = real(pixel);
  46.         zmin = imag(pixel);
  47.         zmax = imag(pixel) + 4/magn/height;
  48.         inside = 0;
  49.         counter = 0;
  50.         z = 0;
  51.  
  52.     }
  53.     void loop(void)
  54.     {
  55.         if  ((type == 0))
  56.         {// bif+sinpi
  57.             z1 = z1 + r * real(f(pi*z1));
  58.         }
  59.         else if  ((type == 1))
  60.         {// bif=sinpi
  61.             z1 = r * real(f(pi*z1));
  62.         }
  63.         else if  ((type == 2))
  64.         {// biflambda
  65.             z1 = r * real(f(z1)) * (1-real(f(z1)));
  66.         }
  67.         else if  ((type == 3))
  68.         {// bifmay
  69.             z1 = (r * z1) / (1 + z1)^power;
  70.         }
  71.         else if  ((type == 4))
  72.         {// bifstewart
  73.             z1 = r * sqr(real(f(z1))) - 1;
  74.         }
  75.         else if  ((type == 5))
  76.         {// bifurcation
  77.             z1 = z1 + r * real(f(z1)) * (1-real(f(z1)));
  78.         }
  79.         if  ((z1 >= zmin && z1 < zmax && counter > filter))
  80.         {
  81.             inside = inside + 1;
  82.         }
  83.  
  84.         counter = counter + 1;
  85.         if  ((counter == maxit))
  86.         {
  87.             z = inside;
  88.         }
  89.  
  90.     }
  91.     bool bailout(void)
  92.     {
  93.         return(true);
  94.  
  95.     }
  96.     void description(void)
  97.     {
  98.         this.title = "Bifurcation";
  99.         this.helpfile = "dmj-pub\dmj-pub-uf-bifurcation.htm";
  100.         this.maxiter = 400;
  101.         this.periodicity = 0;
  102.         this.center = (2,0.5);
  103.         this.magn = 2;
  104.  
  105.    
  106.         type.caption = "Function Type";
  107.         type.default = 5;
  108.         type.enum = "bif+sinpi\nbif=sinpi\nbiflambda\nbifmay\nbifstewart\nbifurcation";
  109.   
  110.    
  111.         start.caption = "Start Value";
  112.         start.default = 0.66;
  113.         start.hint = "Starting value for all points.";
  114.   
  115.    
  116.         filter.caption = "Filter Iterations";
  117.         filter.default = 200;
  118.         filter.hint = "Specifies the number of iterations to skip before plotting orbit points.";
  119.   
  120.    
  121.         power.caption = "Exponent";
  122.         power.default = 5.0;
  123.         power.hint = "Specifies the exponent for the bifmay type.";
  124.   
  125.    
  126.         f.caption = "Extra Function";
  127.         f.default = "ident" ;
  128.         f.hint = "Specifies the extra function. Use sin() to reproduce the default FractInt behavior for sinpi types.";
  129.   
  130.     }
  131. }
  132.  
  133.  
  134. dmj-BoostMandel {
  135. //
  136. // This formula is an implementation of Orbit Boosting,
  137. // an idea by Earl Hinrichs.
  138. //
  139. // The basic idea is that we perform a normal Mandelbrot
  140. // iteration, but if the orbit enters a specified region
  141. // of the complex plane (much like an orbit trap) we
  142. // "boost" it in some fashion. A variety of boosting modes
  143. // are included. Boost regions are ALWAYS circular in this
  144. // implementation.
  145. //
  146. real d;
  147. real radius2;
  148. parameter real boostradius;
  149. real iradius;
  150. parameter complex start;
  151. parameter complex power;
  152. parameter complex boostcenter;
  153. parameter int boostmode;
  154. parameter complex boostamount;
  155. parameter real bailout;
  156.  
  157.     void init(void)
  158.     {
  159.         d = 0;// distance to boost area
  160.         radius2 = sqr(boostradius);// pre-calc this
  161.         iradius = 1/boostradius;// pre-calc this
  162. //  complex c = 0
  163.  
  164.         z = start;
  165.   
  166.     }
  167.     void loop(void)
  168.     {
  169.         z = z^power + pixel;// calculate the M-set
  170.  
  171.         d = |z - boostcenter|;// distance to boost area
  172.         if  ((d < radius2))
  173.         {// within threshold
  174.             if  ((boostmode == 0))
  175.             {// displace (addition)
  176.                 z = z + boostamount;
  177.             }
  178.             else if  ((boostmode == 1))
  179.             {// orbit origin (multiply)
  180.                 z = z * boostamount;
  181.             }
  182.             else if  ((boostmode == 2))
  183.             {// orbit boost (multiply)
  184.                 z = (z-boostcenter) * boostamount + boostcenter;
  185.             }
  186.             else if  ((boostmode == 3))
  187.             {// flip out (reverse distance)
  188.                 d = 2*boostradius/sqrt(d)-1;
  189.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  190.             }
  191.             else if  ((boostmode == 4))
  192.             {// repel (reverse distance squared)
  193.                 d = 1-sqr(1-boostradius/sqrt(d));
  194.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  195.             }
  196.             else if  ((boostmode == 5))
  197.             {// exponentiate origin (exponent)
  198.                 z = z ^ boostamount;
  199.             }
  200.             else if  ((boostmode == 6))
  201.             {// exponentiate boost (exponent)
  202.                 z = (z-boostcenter) ^ boostamount + boostcenter;
  203.             }
  204.             else if  ((boostmode == 7))
  205.             {// invert
  206.                 z = conj(iradius/(z-boostcenter)) + boostcenter;
  207.             }
  208.             else if  ((boostmode == 8))
  209.             {// pass through
  210.                 z = z + 2*(z-boostcenter)*boostamount;
  211.             }
  212.             else if  ((boostmode == 9))
  213.             {// pass through 2
  214.                 z = z + 2*(boostcenter-z)/cabs(boostcenter-z)*boostradius*boostamount;
  215.             }
  216.         }
  217.  
  218.     }
  219.     bool bailout(void)
  220.     {
  221.         return(|z| < bailout);
  222.   
  223.     }
  224.     void description(void)
  225.     {
  226.         this.title = "Orbit Boost (Mandelbrot)";
  227.         this.helpfile = "dmj-pub\dmj-pub-uf-ob.htm";
  228.         this.center = (-0.5, 0.0);
  229.         this.maxiter = 1000;
  230.   
  231.    
  232.         start.caption = "Starting Point";
  233.         start.default = (0,0);
  234.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  235.   
  236.    
  237.         power.caption = "Exponent";
  238.         power.default = (2,0);
  239.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  240.   
  241.    
  242.         bailout.caption = "Bail-out Value";
  243.         bailout.default = 1.0e20;
  244.         bailout.min = 0.0;
  245.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  246.   
  247.  
  248.    
  249.         boostcenter.caption = "Boost Center";
  250.         boostcenter.default = (0,0);
  251.         boostcenter.hint = "This is the location of the boost area in the complex plane.";
  252.   
  253.    
  254.         boostradius.caption = "Boost Radius";
  255.         boostradius.default = 0.5;
  256.         boostradius.hint = "This is the size of the boost area.";
  257.   
  258.    
  259.         boostmode.caption = "Boost Mode";
  260.         boostmode.default = 0;
  261.         boostmode.enum = "displace\norbit origin\norbit boost\nflip out\nrepel\nexponentiate origin\nexponentiate boost\ninvert\npass through\npass through 2";
  262.         boostmode.hint = "Sets the type of effect when the orbit enters the boost area.";
  263.   
  264.    
  265.         boostamount.caption = "Boost Amount";
  266.         boostamount.default = (1,0);
  267.         boostamount.hint = "This is the amount to boost.";
  268.   
  269.  
  270.     }
  271. }
  272.  
  273.  
  274. dmj-BoostJulia {
  275. //
  276. // This formula is an implementation of Orbit Boosting,
  277. // an idea by Earl Hinrichs.
  278. //
  279. // The basic idea is that we perform a normal Julia
  280. // iteration, but if the orbit enters a specified region
  281. // of the complex plane (much like an orbit trap) we
  282. // "boost" it in some fashion. A variety of boosting modes
  283. // are included. Boost regions are ALWAYS circular in this
  284. // implementation.
  285. //
  286. real d;
  287. real radius2;
  288. parameter real boostradius;
  289. real iradius;
  290. parameter complex power;
  291. parameter complex seed;
  292. parameter complex boostcenter;
  293. parameter int boostmode;
  294. parameter complex boostamount;
  295. parameter real bailout;
  296.  
  297.     void init(void)
  298.     {
  299.         d = 0;// distance to boost area
  300.         radius2 = sqr(boostradius);// pre-calc this
  301.         iradius = 1/boostradius;// pre-calc this
  302.  
  303.         z = pixel;
  304.   
  305.     }
  306.     void loop(void)
  307.     {
  308.         z = z^power + seed;// calculate the J-set
  309.  
  310.         d = |z - boostcenter|;// distance to boost area
  311.         if  ((d < radius2))
  312.         {// within threshold
  313.             if  ((boostmode == 0))
  314.             {// displace (addition)
  315.                 z = z + boostamount;
  316.             }
  317.             else if  ((boostmode == 1))
  318.             {// orbit origin (multiply)
  319.                 z = z * boostamount;
  320.             }
  321.             else if  ((boostmode == 2))
  322.             {// orbit boost (multiply)
  323.                 z = (z-boostcenter) * boostamount + boostcenter;
  324.             }
  325.             else if  ((boostmode == 3))
  326.             {// flip out (reverse distance)
  327.                 d = 2*boostradius/sqrt(d)-1;
  328.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  329.             }
  330.             else if  ((boostmode == 4))
  331.             {// repel (reverse distance squared)
  332.                 d = 1-sqr(1-boostradius/sqrt(d));
  333.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  334.             }
  335.             else if  ((boostmode == 5))
  336.             {// exponentiate origin (exponent)
  337.                 z = z ^ boostamount;
  338.             }
  339.             else if  ((boostmode == 6))
  340.             {// exponentiate boost (exponent)
  341.                 z = (z-boostcenter) ^ boostamount + boostcenter;
  342.             }
  343.             else if  ((boostmode == 7))
  344.             {// invert
  345.                 z = conj(iradius/(z-boostcenter)) + boostcenter;
  346.             }
  347.             else if  ((boostmode == 8))
  348.             {// pass through
  349.                 z = z + 2*(z-boostcenter)*boostamount;
  350.             }
  351.             else if  ((boostmode == 9))
  352.             {// pass through 2
  353.                 z = z + 2*(boostcenter-z)/cabs(boostcenter-z)*boostradius*boostamount;
  354.             }
  355.         }
  356.  
  357.     }
  358.     bool bailout(void)
  359.     {
  360.         return(|z| < bailout);
  361.   
  362.     }
  363.     void description(void)
  364.     {
  365.         this.title = "Orbit Boost (Julia)";
  366.         this.helpfile = "dmj-pub\dmj-pub-uf-ob.htm";
  367.         this.center = (0.0, 0.0);
  368.         this.maxiter = 1000;
  369.   
  370.    
  371.         seed.caption = "Julia Seed";
  372.         seed.default = (0,0);
  373.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  374.   
  375.    
  376.         power.caption = "Exponent";
  377.         power.default = (2,0);
  378.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  379.   
  380.    
  381.         bailout.caption = "Bail-out Value";
  382.         bailout.default = 1.0e20;
  383.         bailout.min = 0.0;
  384.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  385.   
  386.  
  387.    
  388.         boostcenter.caption = "Boost Center";
  389.         boostcenter.default = (0,0);
  390.         boostcenter.hint = "This is the location of the boost area in the complex plane.";
  391.   
  392.    
  393.         boostradius.caption = "Boost Radius";
  394.         boostradius.default = 0.5;
  395.         boostradius.hint = "This is the size of the boost area.";
  396.   
  397.    
  398.         boostmode.caption = "Boost Mode";
  399.         boostmode.default = 0;
  400.         boostmode.enum = "displace\norbit origin\norbit boost\nflip out\nrepel\nexponentiate origin\nexponentiate boost\ninvert\npass through\npass through 2";
  401.         boostmode.hint = "Sets the type of effect when the orbit enters the boost area.";
  402.   
  403.    
  404.         boostamount.caption = "Boost Amount";
  405.         boostamount.default = (1,0);
  406.         boostamount.hint = "This is the amount to boost.";
  407.   
  408.  
  409.     }
  410. }
  411.  
  412.  
  413. dmj-BoostNovaMandel {
  414. //
  415. // This formula is an implementation of Orbit Boosting,
  416. // an idea by Earl Hinrichs.
  417. //
  418. // The basic idea is that we perform a normal Nova Mandelbrot
  419. // iteration, but if the orbit enters a specified region
  420. // of the complex plane (much like an orbit trap) we
  421. // "boost" it in some fashion. A variety of boosting modes
  422. // are included. Boost regions are ALWAYS circular in this
  423. // implementation.
  424. //
  425. real d;
  426. real radius2;
  427. parameter real boostradius;
  428. real iradius;
  429. complex zsquared;
  430. complex zcubed;
  431. complex zold;
  432. parameter complex start;
  433. parameter complex power;
  434. parameter complex relax;
  435. parameter complex boostcenter;
  436. parameter int boostmode;
  437. parameter complex boostamount;
  438. parameter real bailout;
  439.  
  440.     void init(void)
  441.     {
  442.         d = 0;// distance to boost area
  443.         radius2 = sqr(boostradius);// pre-calc this
  444.         iradius = 1/boostradius;// pre-calc this
  445. //  complex c = 0
  446.  
  447.         zsquared = (0,0);
  448.         zcubed = (0,0);
  449.         zold = (0,0);
  450.   
  451.         z = start;
  452.   
  453.     }
  454.     void loop(void)
  455.     {
  456.         if  ((power == (3,0)))
  457.         {// special optimized routine for power 3
  458.             zsquared = sqr(z);
  459.             zcubed = zsquared * z;
  460.             zold = z;
  461.             z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  462.         }
  463.         else
  464.         {
  465.  
  466.             zold = z;
  467.             z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  468.         }
  469.  
  470.         d = |z - boostcenter|;// distance to boost area
  471.         if  ((d < radius2))
  472.         {// within threshold
  473.             if  ((boostmode == 0))
  474.             {// displace (addition)
  475.                 z = z + boostamount;
  476.             }
  477.             else if  ((boostmode == 1))
  478.             {// orbit origin (multiply)
  479.                 z = z * boostamount;
  480.             }
  481.             else if  ((boostmode == 2))
  482.             {// orbit boost (multiply)
  483.                 z = (z-boostcenter) * boostamount + boostcenter;
  484.             }
  485.             else if  ((boostmode == 3))
  486.             {// flip out (reverse distance)
  487.                 d = 2*boostradius/sqrt(d)-1;
  488.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  489.             }
  490.             else if  ((boostmode == 4))
  491.             {// repel (reverse distance squared)
  492.                 d = 1-sqr(1-boostradius/sqrt(d));
  493.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  494.             }
  495.             else if  ((boostmode == 5))
  496.             {// exponentiate origin (exponent)
  497.                 z = z ^ boostamount;
  498.             }
  499.             else if  ((boostmode == 6))
  500.             {// exponentiate boost (exponent)
  501.                 z = (z-boostcenter) ^ boostamount + boostcenter;
  502.             }
  503.             else if  ((boostmode == 7))
  504.             {// invert
  505.                 z = conj(iradius/(z-boostcenter)) + boostcenter;
  506.             }
  507.             else if  ((boostmode == 8))
  508.             {// pass through
  509.                 z = z + 2*(z-boostcenter)*boostamount;
  510.             }
  511.             else if  ((boostmode == 9))
  512.             {// pass through 2
  513.                 z = z + 2*(boostcenter-z)/cabs(boostcenter-z)*boostradius*boostamount;
  514.             }
  515.         }
  516.  
  517.     }
  518.     bool bailout(void)
  519.     {
  520.         return(|z - zold| > bailout);
  521.   
  522.     }
  523.     void description(void)
  524.     {
  525.         this.title = "Orbit Boost (Nova Mandelbrot)";
  526.         this.helpfile = "dmj-pub\dmj-pub-uf-nob.htm";
  527.         this.center = (-0.5, 0.0);
  528.         this.maxiter = 1000;
  529.         this.periodicity = 0;
  530.         this.magn = 1.5;
  531.   
  532.    
  533.         start.caption = "Start Value";
  534.         start.default = (1,0);
  535.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  536.   
  537.    
  538.         power.caption = "Exponent";
  539.         power.default = (3,0);
  540.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  541.   
  542.    
  543.         bailout.caption = "Bailout";
  544.         bailout.default = 0.00001;
  545.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  546.   
  547.    
  548.         relax.caption = "Relaxation";
  549.         relax.default = (1,0);
  550.         relax.hint = "This can be used to slow down the convergence of the formula.";
  551.   
  552.  
  553.    
  554.         boostcenter.caption = "Boost Center";
  555.         boostcenter.default = (0,0);
  556.         boostcenter.hint = "This is the location of the boost area in the complex plane.";
  557.   
  558.    
  559.         boostradius.caption = "Boost Radius";
  560.         boostradius.default = 0.5;
  561.         boostradius.hint = "This is the size of the boost area.";
  562.   
  563.    
  564.         boostmode.caption = "Boost Mode";
  565.         boostmode.default = 0;
  566.         boostmode.enum = "displace\norbit origin\norbit boost\nflip out\nrepel\nexponentiate origin\nexponentiate boost\ninvert\npass through\npass through 2";
  567.         boostmode.hint = "Sets the type of effect when the orbit enters the boost area.";
  568.   
  569.    
  570.         boostamount.caption = "Boost Amount";
  571.         boostamount.default = (1,0);
  572.         boostamount.hint = "This is the amount to boost.";
  573.   
  574.  
  575.     }
  576. }
  577.  
  578.  
  579. dmj-BoostNovaJulia {
  580. //
  581. // This formula is an implementation of Orbit Boosting,
  582. // an idea by Earl Hinrichs.
  583. //
  584. // The basic idea is that we perform a normal Nova Julia
  585. // iteration, but if the orbit enters a specified region
  586. // of the complex plane (much like an orbit trap) we
  587. // "boost" it in some fashion. A variety of boosting modes
  588. // are included. Boost regions are ALWAYS circular in this
  589. // implementation.
  590. //
  591. real d;
  592. real radius2;
  593. parameter real boostradius;
  594. real iradius;
  595. complex zsquared;
  596. complex zcubed;
  597. complex zold;
  598. parameter complex power;
  599. parameter complex relax;
  600. parameter complex seed;
  601. parameter complex boostcenter;
  602. parameter int boostmode;
  603. parameter complex boostamount;
  604. parameter real bailout;
  605.  
  606.     void init(void)
  607.     {
  608.         d = 0;// distance to boost area
  609.         radius2 = sqr(boostradius);// pre-calc this
  610.         iradius = 1/boostradius;// pre-calc this
  611.  
  612.         zsquared = (0,0);
  613.         zcubed = (0,0);
  614.         zold = (0,0);
  615.   
  616.         z = pixel;
  617.   
  618.     }
  619.     void loop(void)
  620.     {
  621.         if  ((power == (3,0)))
  622.         {// special optimized routine for power 3
  623.             zsquared = sqr(z);
  624.             zcubed = zsquared * z;
  625.             zold = z;
  626.             z = z - relax * (zcubed-1) / (3*zsquared) + seed;
  627.         }
  628.         else
  629.         {
  630.  
  631.             zold = z;
  632.             z = z - relax * (z^power-1) / (power * z^(power-1)) + seed;
  633.         }
  634.  
  635.         d = |z - boostcenter|;// distance to boost area
  636.         if  ((d < radius2))
  637.         {// within threshold
  638.             if  ((boostmode == 0))
  639.             {// displace (addition)
  640.                 z = z + boostamount;
  641.             }
  642.             else if  ((boostmode == 1))
  643.             {// orbit origin (multiply)
  644.                 z = z * boostamount;
  645.             }
  646.             else if  ((boostmode == 2))
  647.             {// orbit boost (multiply)
  648.                 z = (z-boostcenter) * boostamount + boostcenter;
  649.             }
  650.             else if  ((boostmode == 3))
  651.             {// flip out (reverse distance)
  652.                 d = 2*boostradius/sqrt(d)-1;
  653.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  654.             }
  655.             else if  ((boostmode == 4))
  656.             {// repel (reverse distance squared)
  657.                 d = 1-sqr(1-boostradius/sqrt(d));
  658.                 z = boostcenter + (z-boostcenter)*d*boostamount;
  659.             }
  660.             else if  ((boostmode == 5))
  661.             {// exponentiate origin (exponent)
  662.                 z = z ^ boostamount;
  663.             }
  664.             else if  ((boostmode == 6))
  665.             {// exponentiate boost (exponent)
  666.                 z = (z-boostcenter) ^ boostamount + boostcenter;
  667.             }
  668.             else if  ((boostmode == 7))
  669.             {// invert
  670.                 z = conj(iradius/(z-boostcenter)) + boostcenter;
  671.             }
  672.             else if  ((boostmode == 8))
  673.             {// pass through
  674.                 z = z + 2*(z-boostcenter)*boostamount;
  675.             }
  676.             else if  ((boostmode == 9))
  677.             {// pass through 2
  678.                 z = z + 2*(boostcenter-z)/cabs(boostcenter-z)*boostradius*boostamount;
  679.             }
  680.         }
  681.  
  682.     }
  683.     bool bailout(void)
  684.     {
  685.         return(|z - zold| > bailout);
  686.   
  687.     }
  688.     void description(void)
  689.     {
  690.         this.title = "Orbit Boost (Nova Julia)";
  691.         this.helpfile = "dmj-pub\dmj-pub-uf-nob.htm";
  692.         this.center = (0.0, 0.0);
  693.         this.maxiter = 1000;
  694.         this.periodicity = 0;
  695.         this.magn = 1.5;
  696.   
  697.    
  698.         seed.caption = "Julia Seed";
  699.         seed.default = (0,0);
  700.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  701.   
  702.    
  703.         power.caption = "Exponent";
  704.         power.default = (3,0);
  705.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  706.   
  707.    
  708.         bailout.caption = "Bailout";
  709.         bailout.default = 0.00001;
  710.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  711.   
  712.    
  713.         relax.caption = "Relaxation";
  714.         relax.default = (1,0);
  715.         relax.hint = "This can be used to slow down the convergence of the formula.";
  716.   
  717.  
  718.    
  719.         boostcenter.caption = "Boost Center";
  720.         boostcenter.default = (0,0);
  721.         boostcenter.hint = "This is the location of the boost area in the complex plane.";
  722.   
  723.    
  724.         boostradius.caption = "Boost Radius";
  725.         boostradius.default = 0.5;
  726.         boostradius.hint = "This is the size of the boost area.";
  727.   
  728.    
  729.         boostmode.caption = "Boost Mode";
  730.         boostmode.default = 0;
  731.         boostmode.enum = "displace\norbit origin\norbit boost\nflip out\nrepel\nexponentiate origin\nexponentiate boost\ninvert\npass through\npass through 2";
  732.         boostmode.hint = "Sets the type of effect when the orbit enters the boost area.";
  733.   
  734.    
  735.         boostamount.caption = "Boost Amount";
  736.         boostamount.default = (1,0);
  737.         boostamount.hint = "This is the amount to boost.";
  738.   
  739.  
  740.     }
  741. }
  742.  
  743.  
  744. dmj-DoubleMandel {
  745. //
  746. // This is based on an idea by Jim Muth. It is the
  747. // classical Mandelbrot equation, but with two terms
  748. // of user-specified power and weight.
  749. //
  750. parameter complex start;
  751. parameter complex coeff1;
  752. parameter complex power1;
  753. parameter complex coeff2;
  754. parameter complex power2;
  755. parameter real bailout;
  756.  
  757.     void init(void)
  758.     {
  759.         z = start;
  760.   
  761.     }
  762.     void loop(void)
  763.     {
  764.         z = coeff1*z^power1 + coeff2*z^power2 + pixel;
  765.   
  766.     }
  767.     bool bailout(void)
  768.     {
  769.         return(|z| < bailout);
  770.   
  771.     }
  772.     void description(void)
  773.     {
  774.         this.title = "DoubleMandel";
  775.         this.helpfile = "dmj-pub\dmj-pub-uf-dmj.htm";
  776.  
  777.    
  778.         start.caption = "Start Value";
  779.         start.default = (0,0);
  780.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  781.   
  782.    
  783.         power1.caption = "Primary Exponent";
  784.         power1.default = (2,0);
  785.         power1.hint = "Defines the primary exponent for the equation.";
  786.   
  787.    
  788.         power2.caption = "Secondary Exponent";
  789.         power2.default = (-1,0);
  790.         power2.hint = "Defines the secondary exponent for the equation.";
  791.   
  792.    
  793.         coeff1.caption = "Primary Scale";
  794.         coeff1.default = (1,0);
  795.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  796.   
  797.    
  798.         coeff2.caption = "Secondary Scale";
  799.         coeff2.default = (1,0);
  800.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  801.   
  802.    
  803.         bailout.caption = "Bailout";
  804.         bailout.default = 1e20;
  805.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  806.   
  807.  
  808.     }
  809. }
  810.  
  811.  
  812. dmj-DoubleJulia {
  813. //
  814. // This is based on an idea by Jim Muth. It is the
  815. // classical Julia equation, but with two terms of
  816. // user-specified power and weight.
  817. //
  818. parameter complex coeff1;
  819. parameter complex power1;
  820. parameter complex coeff2;
  821. parameter complex power2;
  822. parameter complex seed;
  823. parameter real bailout;
  824.  
  825.     void init(void)
  826.     {
  827.         z = pixel;
  828.   
  829.     }
  830.     void loop(void)
  831.     {
  832.         z = coeff1*z^power1 + coeff2*z^power2 + seed;
  833.   
  834.     }
  835.     bool bailout(void)
  836.     {
  837.         return(|z| < bailout);
  838.   
  839.     }
  840.     void description(void)
  841.     {
  842.         this.title = "DoubleJulia";
  843.         this.helpfile = "dmj-pub\dmj-pub-uf-dmj.htm";
  844.  
  845.    
  846.         seed.caption = "Julia Seed";
  847.         seed.default = (0,0);
  848.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  849.   
  850.    
  851.         power1.caption = "Primary Exponent";
  852.         power1.default = (2,0);
  853.         power1.hint = "Defines the primary exponent for the equation.";
  854.   
  855.    
  856.         power2.caption = "Secondary Exponent";
  857.         power2.default = (-1,0);
  858.         power2.hint = "Defines the secondary exponent for the equation.";
  859.   
  860.    
  861.         coeff1.caption = "Primary Scale";
  862.         coeff1.default = (1,0);
  863.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  864.   
  865.    
  866.         coeff2.caption = "Secondary Scale";
  867.         coeff2.default = (1,0);
  868.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  869.   
  870.    
  871.         bailout.caption = "Bailout";
  872.         bailout.default = 1e20;
  873.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  874.   
  875.  
  876.     }
  877. }
  878.  
  879.  
  880. dmj-DNovaMandel {
  881. //
  882. // This is the DoubleNova fractal (Mandelbrot form),
  883. // a modified Newtonian-style fractal. DoubleNova is
  884. // like Nova, but with two terms instead of one.
  885. //
  886. complex zold;
  887. parameter complex start;
  888. parameter bool usecritical;
  889. parameter complex power2;
  890. parameter complex coeff2;
  891. parameter complex power1;
  892. parameter complex coeff1;
  893. parameter complex relax;
  894. parameter real bailout;
  895.  
  896.     void init(void)
  897.     {
  898.         zold = (0,0);
  899.   
  900.         z = start;
  901.         if  ((usecritical))
  902.         {
  903.             z = ( -((power2-1)*power2*coeff2) / ((power1-1)*power1*coeff1) ) ^ (1/(power1-power2));
  904.         }
  905.   
  906.     }
  907.     void loop(void)
  908.     {
  909.         zold = z;
  910.         z = z - (coeff1*z^power1 + coeff2*z^power2 - 1) * relax / (coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1)) + pixel;
  911.   
  912.     }
  913.     bool bailout(void)
  914.     {
  915.         return(|z - zold| > bailout);
  916.   
  917.     }
  918.     void description(void)
  919.     {
  920.         this.title = "DoubleNova (Mandelbrot)";
  921.         this.helpfile = "dmj-pub\dmj-pub-uf-dn.htm";
  922.         this.maxiter = 1000;
  923.         this.periodicity = 0;
  924.         this.center = (-0.5,0);
  925.         this.magn = 1.5;
  926.   
  927.    
  928.         start.caption = "Start Value";
  929.         start.default = (1,0);
  930.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  931.   
  932.    
  933.         power1.caption = "Primary Exponent";
  934.         power1.default = (4,0);
  935.         power1.hint = "Defines the primary exponent for the equation.";
  936.   
  937.    
  938.         power2.caption = "Secondary Exponent";
  939.         power2.default = (2,0);
  940.         power2.hint = "Defines the secondary exponent for the equation.";
  941.   
  942.    
  943.         coeff1.caption = "Primary Scale";
  944.         coeff1.default = (1,0);
  945.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  946.   
  947.    
  948.         coeff2.caption = "Secondary Scale";
  949.         coeff2.default = (-3,0);
  950.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  951.   
  952.    
  953.         bailout.caption = "Bailout";
  954.         bailout.default = 0.00001;
  955.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  956.   
  957.    
  958.         usecritical.caption = "Use Critical Point";
  959.         usecritical.default = false;
  960.         usecritical.hint = "If set, a critical point for the function will be used in place of the Start Value.";
  961.   
  962.    
  963.         relax.caption = "Relaxation";
  964.         relax.default = (1,0);
  965.         relax.hint = "This can be used to slow down the convergence of the formula.";
  966.   
  967.  
  968.     }
  969. }
  970.  
  971.  
  972. dmj-DNovaJulia {
  973. //
  974. // This is the DoubleNova fractal (Julia form), a
  975. // modified Newtonian-style fractal. DoubleNova is
  976. // like Nova, but with two terms instead of one.
  977. //
  978. complex zold;
  979. parameter complex coeff1;
  980. parameter complex power1;
  981. parameter complex coeff2;
  982. parameter complex power2;
  983. parameter complex relax;
  984. parameter complex seed;
  985. parameter real bailout;
  986.  
  987.     void init(void)
  988.     {
  989.         zold = (0,0);
  990.   
  991.         z = pixel;
  992.   
  993.     }
  994.     void loop(void)
  995.     {
  996.         zold = z;
  997.         z = z - (coeff1*z^power1 + coeff2*z^power2 - 1) * relax / (coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1)) + seed;
  998.   
  999.     }
  1000.     bool bailout(void)
  1001.     {
  1002.         return(|z - zold| > bailout);
  1003.   
  1004.     }
  1005.     void description(void)
  1006.     {
  1007.         this.title = "DoubleNova (Julia)";
  1008.         this.helpfile = "dmj-pub\dmj-pub-uf-dn.htm";
  1009.         this.maxiter = 1000;
  1010.         this.periodicity = 0;
  1011.         this.center = (0,0);
  1012.         this.magn = 1.5;
  1013.   
  1014.    
  1015.         seed.caption = "Julia Seed";
  1016.         seed.default = (0,0);
  1017.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  1018.   
  1019.    
  1020.         power1.caption = "Primary Exponent";
  1021.         power1.default = (4,0);
  1022.         power1.hint = "Defines the primary exponent for the equation.";
  1023.   
  1024.    
  1025.         power2.caption = "Secondary Exponent";
  1026.         power2.default = (2,0);
  1027.         power2.hint = "Defines the secondary exponent for the equation.";
  1028.   
  1029.    
  1030.         coeff1.caption = "Primary Scale";
  1031.         coeff1.default = (1,0);
  1032.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  1033.   
  1034.    
  1035.         coeff2.caption = "Secondary Scale";
  1036.         coeff2.default = (-2,0);
  1037.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  1038.   
  1039.    
  1040.         bailout.caption = "Bailout";
  1041.         bailout.default = 0.00001;
  1042.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  1043.   
  1044.    
  1045.         relax.caption = "Relaxation";
  1046.         relax.default = (1,0);
  1047.         relax.hint = "This can be used to slow down the convergence of the formula.";
  1048.   
  1049.  
  1050.     }
  1051. }
  1052.  
  1053.  
  1054. dmj-DHNovaMandel {
  1055. //
  1056. // This is the DoubleHalleyNova fractal (Mandelbrot form),
  1057. // a modified Newtonian-style fractal. DoubleHalleyNova is
  1058. // like HalleyNova, but with two terms instead of one.
  1059. //
  1060. complex zold;
  1061. complex fz;
  1062. complex f1z;
  1063. complex f2z;
  1064. parameter complex start;
  1065. parameter complex coeff1;
  1066. parameter complex power1;
  1067. parameter complex coeff2;
  1068. parameter complex power2;
  1069. parameter complex relax;
  1070. parameter real bailout;
  1071.  
  1072.     void init(void)
  1073.     {
  1074.         zold = (0,0);
  1075.         fz = (0,0);
  1076.         f1z = (0,0);
  1077.         f2z = (0,0);
  1078.   
  1079.         z = start;
  1080. //  IF (@usecritical)
  1081. //  ENDIF
  1082.   
  1083.     }
  1084.     void loop(void)
  1085.     {
  1086.         zold = z;
  1087.         fz  = coeff1*z^power1 + coeff2*z^power2 - 1;
  1088.         f1z = coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1);
  1089.         f2z = coeff1*power1*(power1-1)*z^(power1-2) + coeff2*power2*(power2-1)*z^(power2-2);
  1090.         z = z - relax * (2*fz*f1z) / (2*f1z^2 - fz*f2z) + pixel;
  1091.   
  1092.     }
  1093.     bool bailout(void)
  1094.     {
  1095.         return(|z - zold| > bailout);
  1096.   
  1097.     }
  1098.     void description(void)
  1099.     {
  1100.         this.title = "DoubleHalleyNova (Mandelbrot)";
  1101.         this.helpfile = "dmj-pub\dmj-pub-uf-dhn.htm";
  1102.         this.maxiter = 1000;
  1103.         this.periodicity = 0;
  1104.         this.center = (-0.5,0);
  1105.         this.magn = 1.5;
  1106.   
  1107.    
  1108.         start.caption = "Start Value";
  1109.         start.default = (1,0);
  1110.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  1111.   
  1112.    
  1113.         power1.caption = "Primary Exponent";
  1114.         power1.default = (4,0);
  1115.         power1.hint = "Defines the primary exponent for the equation.";
  1116.   
  1117.    
  1118.         power2.caption = "Secondary Exponent";
  1119.         power2.default = (2,0);
  1120.         power2.hint = "Defines the secondary exponent for the equation.";
  1121.   
  1122.    
  1123.         coeff1.caption = "Primary Scale";
  1124.         coeff1.default = (1,0);
  1125.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  1126.   
  1127.    
  1128.         coeff2.caption = "Secondary Scale";
  1129.         coeff2.default = (-3,0);
  1130.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  1131.   
  1132.    
  1133.         bailout.caption = "Bailout";
  1134.         bailout.default = 0.00001;
  1135.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  1136.   
  1137. //  param usecritical
  1138. //    caption = "Use Critical Point"
  1139. //    default = false
  1140. //    hint = "If set, a critical point for the function will ;            be used in place of the Start Value."
  1141. //  endparam
  1142.    
  1143.         relax.caption = "Relaxation";
  1144.         relax.default = (1,0);
  1145.         relax.hint = "This can be used to slow down the convergence of the formula.";
  1146.   
  1147.  
  1148.     }
  1149. }
  1150.  
  1151.  
  1152. dmj-DHNovaJulia {
  1153. //
  1154. // This is the DoubleHalleyNova fractal (Julia form), a
  1155. // modified Newtonian-style fractal. DoubleHalleyNova is
  1156. // like HalleyNova, but with two terms instead of one.
  1157. //
  1158. complex zold;
  1159. complex fz;
  1160. complex f1z;
  1161. complex f2z;
  1162. parameter complex coeff1;
  1163. parameter complex power1;
  1164. parameter complex coeff2;
  1165. parameter complex power2;
  1166. parameter complex relax;
  1167. parameter complex seed;
  1168. parameter real bailout;
  1169.  
  1170.     void init(void)
  1171.     {
  1172.         zold = (0,0);
  1173.         fz = (0,0);
  1174.         f1z = (0,0);
  1175.         f2z = (0,0);
  1176.   
  1177.         z = pixel;
  1178.   
  1179.     }
  1180.     void loop(void)
  1181.     {
  1182.         zold = z;
  1183.         fz  = coeff1*z^power1 + coeff2*z^power2 - 1;
  1184.         f1z = coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1);
  1185.         f2z = coeff1*power1*(power1-1)*z^(power1-2) + coeff2*power2*(power2-1)*z^(power2-2);
  1186.         z = z - relax * (2*fz*f1z) / (2*f1z^2 - fz*f2z) + seed;
  1187.   
  1188.     }
  1189.     bool bailout(void)
  1190.     {
  1191.         return(|z - zold| > bailout);
  1192.   
  1193.     }
  1194.     void description(void)
  1195.     {
  1196.         this.title = "DoubleHalleyNova (Julia)";
  1197.         this.helpfile = "dmj-pub\dmj-pub-uf-dhn.htm";
  1198.         this.maxiter = 1000;
  1199.         this.periodicity = 0;
  1200.         this.center = (0,0);
  1201.         this.magn = 1.5;
  1202.   
  1203.    
  1204.         seed.caption = "Julia Seed";
  1205.         seed.default = (0,0);
  1206.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  1207.   
  1208.    
  1209.         power1.caption = "Primary Exponent";
  1210.         power1.default = (4,0);
  1211.         power1.hint = "Defines the primary exponent for the equation.";
  1212.   
  1213.    
  1214.         power2.caption = "Secondary Exponent";
  1215.         power2.default = (2,0);
  1216.         power2.hint = "Defines the secondary exponent for the equation.";
  1217.   
  1218.    
  1219.         coeff1.caption = "Primary Scale";
  1220.         coeff1.default = (1,0);
  1221.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  1222.   
  1223.    
  1224.         coeff2.caption = "Secondary Scale";
  1225.         coeff2.default = (-2,0);
  1226.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  1227.   
  1228.    
  1229.         bailout.caption = "Bailout";
  1230.         bailout.default = 0.00001;
  1231.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  1232.   
  1233.    
  1234.         relax.caption = "Relaxation";
  1235.         relax.default = (1,0);
  1236.         relax.hint = "This can be used to slow down the convergence of the formula.";
  1237.   
  1238.  
  1239.     }
  1240. }
  1241.  
  1242.  
  1243. dmj-fBmMandel {
  1244. //
  1245. // This is the basic Mandelbrot type, but with a
  1246. // bit of fBm noise added at each iteration. This
  1247. // tends to distort the fractal beyond all recognition
  1248. // after just a few iterations, which may or may not
  1249. // be what you're looking for.
  1250. //
  1251. // You can also use the "Coloring Only" option to
  1252. // restrict the fBm distortion to the value passed
  1253. // to the coloring algorithm; the distortion will be
  1254. // removed before the next iteration is calculated.
  1255. //
  1256. parameter complex start;
  1257. complex oz;
  1258. complex c;
  1259. parameter complex distcenter;
  1260. parameter bool centermove;
  1261. complex r;
  1262. parameter real Parm_angle;
  1263. complex r2;
  1264. parameter real anglestep;
  1265. complex r3;
  1266. parameter real distangle;
  1267. real fiter;
  1268. parameter real noisestart;
  1269. bool noise;
  1270. parameter real noiseskip;
  1271. parameter real noiseiter;
  1272. parameter bool coloronly;
  1273. parameter complex power;
  1274. complex p;
  1275. parameter real scale;
  1276. parameter complex offset;
  1277. real sum;
  1278. real freq;
  1279. complex v;
  1280. int i;
  1281. parameter real octaves;
  1282. real bx0;
  1283. real by0;
  1284. real bx1;
  1285. real by1;
  1286. real rx0;
  1287. real ry0;
  1288. real rx1;
  1289. real ry1;
  1290. real b00;
  1291. parameter real npower;
  1292. real b10;
  1293. real b01;
  1294. real b11;
  1295. real g_b00_0;
  1296. real g_b10_0;
  1297. real g_b01_0;
  1298. real g_b11_0;
  1299. real g_b00_1;
  1300. real g_b10_1;
  1301. real g_b01_1;
  1302. real g_b11_1;
  1303. real d;
  1304. real u1;
  1305. real v1;
  1306. real u2;
  1307. real v2;
  1308. real sx;
  1309. real sy;
  1310. real a;
  1311. real b;
  1312. parameter real step;
  1313. parameter int style;
  1314. parameter real distortion;
  1315. parameter real bailout;
  1316.  
  1317.     void init(void)
  1318.     {
  1319.         z = start;
  1320.         oz = z;
  1321.  
  1322.         c = distcenter;
  1323.         if  ((centermove))
  1324.         {
  1325.             c = center;
  1326.         }
  1327.  
  1328.         r = (0,1) ^ (Parm_angle / 90.0);
  1329.         r2 = (0,1) ^ (anglestep / 90.0);
  1330.         r3 = (0,1) ^ (distangle / 90.0);
  1331.   
  1332.         fiter = noisestart;
  1333.         noise = false;
  1334.   
  1335.     }
  1336.     void loop(void)
  1337.     {
  1338.         if  ((noiseskip != 0))
  1339.         {// we are skipping some iterations
  1340.             fiter = fiter - 1;// one less to go before we add noise
  1341.             while  ((fiter < 0.0))
  1342.             {// iterations all used up
  1343.                 if  ((noise))
  1344.                 {// we are currently adding noise
  1345.                     noise = false;// so stop
  1346.                     fiter = fiter + noiseskip;// skip this many iterations
  1347.                 }
  1348.                 else
  1349.                 {
  1350. // we aren't currently adding noise
  1351.                     noise = true;// so start
  1352.                     fiter = fiter + noiseiter;// do this many iterations
  1353.                 }
  1354.             }
  1355.         }
  1356.  
  1357.         if  ((coloronly))
  1358.         {// only using fBm on coloring
  1359.             z = oz;// restore z from un-fBm'ed copy
  1360.         }
  1361.         z = z^power + pixel;// do Mandelbrot iteration
  1362.         if  ((coloronly))
  1363.         {// only using fBm on coloring
  1364.             oz = z;
  1365.         }
  1366.  
  1367.         if  ((noiseskip == 0.0 || noise))
  1368.         {// adding noise this iteration
  1369.             p = z * scale * r + offset;
  1370.             sum = 0.0;
  1371.             freq = 1.0;
  1372.             v = (0,0);
  1373.             i = octaves;
  1374.             while  ((i > 0))
  1375.             {
  1376.       // determine integer coordinate for corners of square
  1377.       // surrounding p
  1378.                 bx0 = floor(real(p)) % 256;
  1379.                 by0 = floor(imag(p)) % 256;
  1380.                 if  ((bx0 < 0))
  1381.                 {
  1382.                     bx0 = bx0 + 256;
  1383.                 }
  1384.                 if  ((by0 < 0))
  1385.                 {
  1386.                     by0 = by0 + 256;
  1387.                 }
  1388.                 bx1 = (bx0 + 1) % 256;
  1389.                 by1 = (by0 + 1) % 256;
  1390.  
  1391.                 rx0 = real(p) - floor(real(p));
  1392.                 ry0 = imag(p) - floor(imag(p));
  1393.                 rx1 = rx0 - 1;
  1394.                 ry1 = ry0 - 1;
  1395.       
  1396.       // create a "random" index for each corner
  1397.       // (this is where Intel's version differs from Perlin's;
  1398.       // I used Intel's version because it doesn't require a
  1399.       // pre-computed random table, which is difficult to manage
  1400.       // in UF.)
  1401.                 b00 = (bx0^npower % 65536 + by0)^npower % 65536;
  1402.                 b10 = (bx1^npower % 65536 + by0)^npower % 65536;
  1403.                 b01 = (bx0^npower % 65536 + by1)^npower % 65536;
  1404.                 b11 = (bx1^npower % 65536 + by1)^npower % 65536;
  1405.  
  1406.       // produce a "random" vector for each corner
  1407.                 g_b00_0 = (b00)^npower*0.25 % 512 - 256;
  1408.                 g_b10_0 = (b10)^npower*0.25 % 512 - 256;
  1409.                 g_b01_0 = (b01)^npower*0.25 % 512 - 256;
  1410.                 g_b11_0 = (b11)^npower*0.25 % 512 - 256;
  1411.                 g_b00_1 = (b00+1)^npower*0.25 % 512 - 256;
  1412.                 g_b10_1 = (b10+1)^npower*0.25 % 512 - 256;
  1413.                 g_b01_1 = (b01+1)^npower*0.25 % 512 - 256;
  1414.                 g_b11_1 = (b11+1)^npower*0.25 % 512 - 256;
  1415.       
  1416.       // normalize each vector
  1417.                 d = 0.0;//
  1418.                 d = 1 / sqrt(sqr(g_b00_0) + sqr(g_b00_1));
  1419.                 g_b00_0 = g_b00_0 * d;
  1420.                 g_b00_1 = g_b00_1 * d;
  1421.                 d = 1 / sqrt(sqr(g_b10_0) + sqr(g_b10_1));
  1422.                 g_b10_0 = g_b10_0 * d;
  1423.                 g_b10_1 = g_b10_1 * d;
  1424.                 d = 1 / sqrt(sqr(g_b01_0) + sqr(g_b01_1));
  1425.                 g_b01_0 = g_b01_0 * d;
  1426.                 g_b01_1 = g_b01_1 * d;
  1427.                 d = 1 / sqrt(sqr(g_b11_0) + sqr(g_b11_1));
  1428.                 g_b11_0 = g_b11_0 * d;
  1429.                 g_b11_1 = g_b11_1 * d;
  1430.       
  1431.       // produce colors for each corner
  1432.                 u1 = rx0 * g_b00_0 + ry0 * g_b00_1;
  1433.                 v1 = rx1 * g_b10_0 + ry0 * g_b10_1;
  1434.                 u2 = rx0 * g_b01_0 + ry1 * g_b01_1;
  1435.                 v2 = rx1 * g_b11_0 + ry1 * g_b11_1;
  1436.       
  1437.       // interpolate between corners using
  1438.       // bilinear filtering
  1439.                 sx = sqr(rx0) * (3 - rx0*2);
  1440.                 sy = sqr(ry0) * (3 - ry0*2);
  1441.                 a = u1 + sx*(v1-u1);
  1442.                 b = u2 + sx*(v2-u2);
  1443.       
  1444.                 sum = sum + (a + sy*(b-a))*freq;
  1445.                 freq = freq * step;
  1446.                 p = p * r2 / step;
  1447.                 i = i - 1;
  1448.             }
  1449.  
  1450.             if  ((style == 0))
  1451.             {// radial distortion
  1452.                 v = (z-c)/cabs(z-c) * r3;// use vector based on angle to distortion center
  1453.             }
  1454.             else if  ((style == 1))
  1455.             {// linear distortion
  1456.                 v = r3;// just use rotation vector
  1457.             }
  1458.             z = z + v * sum*0.5*distortion;
  1459.         }
  1460.  
  1461.         if  ((coloronly == false))
  1462.         {// not just using fBm on coloring
  1463.             oz = z;// value for bailout is fBm'ed z
  1464.         }
  1465.   
  1466.     }
  1467.     bool bailout(void)
  1468.     {
  1469.         return(|oz| < bailout);
  1470.  
  1471.     }
  1472.     void description(void)
  1473.     {
  1474.         this.title = "Mandelbrot + fBm";
  1475.         this.helpfile = "dmj-pub\dmj-pub-uf-mjf.htm";
  1476.         this.center = (-0.5,0);
  1477.         this.magn = 1.0;
  1478.   
  1479.    
  1480.         start.caption = "Start Value";
  1481.         start.default = (0,0);
  1482.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  1483.   
  1484.    
  1485.         power.caption = "Exponent";
  1486.         power.default = (2,0);
  1487.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  1488.   
  1489.    
  1490.         bailout.caption = "Bailout";
  1491.         bailout.default = 1.0e20;
  1492.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  1493.   
  1494.  
  1495.    
  1496.         distortion.caption = "Distortion Strength";
  1497.         distortion.default = 1.0;
  1498.         distortion.hint = "This is the amount the noise distorts the image.";
  1499.   
  1500.    
  1501.         style.caption = "Distortion Style";
  1502.         style.default = 0;
  1503.         style.enum = "radial\nlinear";
  1504.         style.hint = "This selects whether the distortion will be focused around a single point, or directed along a line.";
  1505.   
  1506.    
  1507.         distangle.caption = "Distortion Angle";
  1508.         distangle.default = 0.0;
  1509.         distangle.hint = "This is the angle to rotate the distortion.";
  1510.   
  1511.    
  1512.         distcenter.caption = "Distortion Center";
  1513.         distcenter.default = (0,0);
  1514.         distcenter.hint = "Sets the center of distortion.  If Use Screen Center is set, this item is ignored.";
  1515.   
  1516.    
  1517.         centermove.caption = "Use Screen Center";
  1518.         centermove.default = FALSE;
  1519.         centermove.hint = "If set, distortion will be around the center of the window, regardless of the Distortion Center setting.";
  1520.   
  1521.    
  1522.         offset.caption = "Noise Offset";
  1523.         offset.default = (0,0);
  1524.         offset.hint = "This is the offset of the pattern. You can use this to shift the pattern around on the complex plane.";
  1525.   
  1526.    
  1527.         scale.caption = "Noise Scale";
  1528.         scale.default = 1.0;
  1529.         scale.hint = "This is the overall scale of the noise.";
  1530.   
  1531.    
  1532.         Parm_angle.caption = "Noise Rotation";
  1533.         Parm_angle.default = 0.0;
  1534.         Parm_angle.hint = "This is the angle, in degrees, of the noise.";
  1535.   
  1536.    
  1537.         step.caption = "Noise Scale Step";
  1538.         step.default = 0.5;
  1539.         step.hint = "This is the step in scale between noise iterations.";
  1540.   
  1541.    
  1542.         anglestep.caption = "Noise Rotation Step";
  1543.         anglestep.default = 37.0;
  1544.         anglestep.hint = "This is the angle, in degrees, to rotate between noise iterations.";
  1545.   
  1546.    
  1547.         octaves.caption = "Noise Octaves";
  1548.         octaves.default = 7;
  1549.         octaves.min = 1;
  1550.         octaves.hint = "This is the number of iterations of the noise formula.";
  1551.   
  1552.    
  1553.         npower.caption = "Noise Exponent";
  1554.         npower.default = 2.0;
  1555.         npower.hint = "This is the exponent used to scramble numbers.";
  1556.   
  1557.  
  1558.    
  1559.         noisestart.caption = "Start Iteration";
  1560.         noisestart.default = 0.0;
  1561.         noisestart.hint = "This is the iteration at which to start adding noise.";
  1562.   
  1563.    
  1564.         noiseiter.caption = "Noise Iterations";
  1565.         noiseiter.default = 10000.0;
  1566.         noiseiter.hint = "This is the number of iterations to add noise to.";
  1567.   
  1568.    
  1569.         noiseskip.caption = "Skip Iterations";
  1570.         noiseskip.default = 0.0;
  1571.         noiseskip.hint = "This is the number of iterations to skip adding noise before starting again.";
  1572.   
  1573.    
  1574.         coloronly.caption = "Coloring Only";
  1575.         coloronly.default = false;
  1576.         coloronly.hint = "If set, noise will only apply to pixel values passed to the coloring algorithm; it will not be included in the fractal calculation between iterations.";
  1577.   
  1578.  
  1579.     }
  1580. }
  1581.  
  1582.  
  1583. dmj-fBmJulia {
  1584. //
  1585. // This is the basic Julia type, but with a
  1586. // bit of fBm noise added at each iteration. This
  1587. // tends to distort the fractal beyond all recognition
  1588. // after just a few iterations, which may or may not
  1589. // be what you're looking for.
  1590. //
  1591. // You can also use the "Coloring Only" option to
  1592. // restrict the fBm distortion to the value passed
  1593. // to the coloring algorithm; the distortion will be
  1594. // removed before the next iteration is calculated.
  1595. //
  1596. complex oz;
  1597. complex c;
  1598. parameter complex distcenter;
  1599. parameter bool centermove;
  1600. complex r;
  1601. parameter real Parm_angle;
  1602. complex r2;
  1603. parameter real anglestep;
  1604. complex r3;
  1605. parameter real distangle;
  1606. real fiter;
  1607. parameter real noisestart;
  1608. bool noise;
  1609. parameter real noiseskip;
  1610. parameter real noiseiter;
  1611. parameter bool coloronly;
  1612. parameter complex power;
  1613. parameter complex seed;
  1614. complex p;
  1615. parameter real scale;
  1616. parameter complex offset;
  1617. real sum;
  1618. real freq;
  1619. complex v;
  1620. int i;
  1621. parameter real octaves;
  1622. real bx0;
  1623. real by0;
  1624. real bx1;
  1625. real by1;
  1626. real rx0;
  1627. real ry0;
  1628. real rx1;
  1629. real ry1;
  1630. real b00;
  1631. parameter real npower;
  1632. real b10;
  1633. real b01;
  1634. real b11;
  1635. real g_b00_0;
  1636. real g_b10_0;
  1637. real g_b01_0;
  1638. real g_b11_0;
  1639. real g_b00_1;
  1640. real g_b10_1;
  1641. real g_b01_1;
  1642. real g_b11_1;
  1643. real d;
  1644. real u1;
  1645. real v1;
  1646. real u2;
  1647. real v2;
  1648. real sx;
  1649. real sy;
  1650. real a;
  1651. real b;
  1652. parameter real step;
  1653. parameter int style;
  1654. parameter real distortion;
  1655. parameter real bailout;
  1656.  
  1657.     void init(void)
  1658.     {
  1659.         z = pixel;
  1660.         oz = z;
  1661.  
  1662.         c = distcenter;
  1663.         if  ((centermove))
  1664.         {
  1665.             c = center;
  1666.         }
  1667.  
  1668.         r = (0,1) ^ (Parm_angle / 90.0);
  1669.         r2 = (0,1) ^ (anglestep / 90.0);
  1670.         r3 = (0,1) ^ (distangle / 90.0);
  1671.   
  1672.         fiter = noisestart;
  1673.         noise = false;
  1674.   
  1675.     }
  1676.     void loop(void)
  1677.     {
  1678.         if  ((noiseskip != 0))
  1679.         {// we are skipping some iterations
  1680.             fiter = fiter - 1;// one less to go before we add noise
  1681.             while  ((fiter < 0.0))
  1682.             {// iterations all used up
  1683.                 if  ((noise))
  1684.                 {// we are currently adding noise
  1685.                     noise = false;// so stop
  1686.                     fiter = fiter + noiseskip;// skip this many iterations
  1687.                 }
  1688.                 else
  1689.                 {
  1690. // we aren't currently adding noise
  1691.                     noise = true;// so start
  1692.                     fiter = fiter + noiseiter;// do this many iterations
  1693.                 }
  1694.             }
  1695.         }
  1696.  
  1697.         if  ((coloronly))
  1698.         {// only using fBm on coloring
  1699.             z = oz;// restore z from un-fBm'ed copy
  1700.         }
  1701.         z = z^power + seed;// do Julia iteration
  1702.         if  ((coloronly))
  1703.         {// only using fBm on coloring
  1704.             oz = z;
  1705.         }
  1706.  
  1707.         if  ((noiseskip == 0.0 || noise))
  1708.         {// adding noise this iteration
  1709.             p = z * scale * r + offset;
  1710.             sum = 0.0;
  1711.             freq = 1.0;
  1712.             v = (0,0);
  1713.             i = octaves;
  1714.             while  ((i > 0))
  1715.             {
  1716.       // determine integer coordinate for corners of square
  1717.       // surrounding p
  1718.                 bx0 = floor(real(p)) % 256;
  1719.                 by0 = floor(imag(p)) % 256;
  1720.                 if  ((bx0 < 0))
  1721.                 {
  1722.                     bx0 = bx0 + 256;
  1723.                 }
  1724.                 if  ((by0 < 0))
  1725.                 {
  1726.                     by0 = by0 + 256;
  1727.                 }
  1728.                 bx1 = (bx0 + 1) % 256;
  1729.                 by1 = (by0 + 1) % 256;
  1730.  
  1731.                 rx0 = real(p) - floor(real(p));
  1732.                 ry0 = imag(p) - floor(imag(p));
  1733.                 rx1 = rx0 - 1;
  1734.                 ry1 = ry0 - 1;
  1735.       
  1736.       // create a "random" index for each corner
  1737.       // (this is where Intel's version differs from Perlin's;
  1738.       // I used Intel's version because it doesn't require a
  1739.       // pre-computed random table, which is difficult to manage
  1740.       // in UF.)
  1741.                 b00 = (bx0^npower % 65536 + by0)^npower % 65536;
  1742.                 b10 = (bx1^npower % 65536 + by0)^npower % 65536;
  1743.                 b01 = (bx0^npower % 65536 + by1)^npower % 65536;
  1744.                 b11 = (bx1^npower % 65536 + by1)^npower % 65536;
  1745.  
  1746.       // produce a "random" vector for each corner
  1747.                 g_b00_0 = (b00)^npower*0.25 % 512 - 256;
  1748.                 g_b10_0 = (b10)^npower*0.25 % 512 - 256;
  1749.                 g_b01_0 = (b01)^npower*0.25 % 512 - 256;
  1750.                 g_b11_0 = (b11)^npower*0.25 % 512 - 256;
  1751.                 g_b00_1 = (b00+1)^npower*0.25 % 512 - 256;
  1752.                 g_b10_1 = (b10+1)^npower*0.25 % 512 - 256;
  1753.                 g_b01_1 = (b01+1)^npower*0.25 % 512 - 256;
  1754.                 g_b11_1 = (b11+1)^npower*0.25 % 512 - 256;
  1755.       
  1756.       // normalize each vector
  1757.                 d = 0.0;//
  1758.                 d = 1 / sqrt(sqr(g_b00_0) + sqr(g_b00_1));
  1759.                 g_b00_0 = g_b00_0 * d;
  1760.                 g_b00_1 = g_b00_1 * d;
  1761.                 d = 1 / sqrt(sqr(g_b10_0) + sqr(g_b10_1));
  1762.                 g_b10_0 = g_b10_0 * d;
  1763.                 g_b10_1 = g_b10_1 * d;
  1764.                 d = 1 / sqrt(sqr(g_b01_0) + sqr(g_b01_1));
  1765.                 g_b01_0 = g_b01_0 * d;
  1766.                 g_b01_1 = g_b01_1 * d;
  1767.                 d = 1 / sqrt(sqr(g_b11_0) + sqr(g_b11_1));
  1768.                 g_b11_0 = g_b11_0 * d;
  1769.                 g_b11_1 = g_b11_1 * d;
  1770.       
  1771.       // produce colors for each corner
  1772.                 u1 = rx0 * g_b00_0 + ry0 * g_b00_1;
  1773.                 v1 = rx1 * g_b10_0 + ry0 * g_b10_1;
  1774.                 u2 = rx0 * g_b01_0 + ry1 * g_b01_1;
  1775.                 v2 = rx1 * g_b11_0 + ry1 * g_b11_1;
  1776.       
  1777.       // interpolate between corners using
  1778.       // bilinear filtering
  1779.                 sx = sqr(rx0) * (3 - rx0*2);
  1780.                 sy = sqr(ry0) * (3 - ry0*2);
  1781.                 a = u1 + sx*(v1-u1);
  1782.                 b = u2 + sx*(v2-u2);
  1783.       
  1784.                 sum = sum + (a + sy*(b-a))*freq;
  1785.                 freq = freq * step;
  1786.                 p = p * r2 / step;
  1787.                 i = i - 1;
  1788.             }
  1789.  
  1790.             if  ((style == 0))
  1791.             {// radial distortion
  1792.                 v = (z-c)/cabs(z-c) * r3;// use vector based on angle to distortion center
  1793.             }
  1794.             else if  ((style == 1))
  1795.             {// linear distortion
  1796.                 v = r3;// just use rotation vector
  1797.             }
  1798.             z = z + v * sum*0.5*distortion;
  1799.         }
  1800.   
  1801.         if  ((coloronly == false))
  1802.         {// not just using fBm on coloring
  1803.             oz = z;// value for bailout is fBm'ed z
  1804.         }
  1805.   
  1806.     }
  1807.     bool bailout(void)
  1808.     {
  1809.         return(|oz| < bailout);
  1810.  
  1811.     }
  1812.     void description(void)
  1813.     {
  1814.         this.title = "Julia + fBm";
  1815.         this.helpfile = "dmj-pub\dmj-pub-uf-mjf.htm";
  1816.         this.center = (-0.5,0);
  1817.         this.magn = 1.0;
  1818.   
  1819.    
  1820.         seed.caption = "Julia Seed";
  1821.         seed.default = (0,0);
  1822.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  1823.   
  1824.    
  1825.         power.caption = "Exponent";
  1826.         power.default = (2,0);
  1827.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  1828.   
  1829.    
  1830.         bailout.caption = "Bailout";
  1831.         bailout.default = 1.0e20;
  1832.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  1833.   
  1834.  
  1835.    
  1836.         distortion.caption = "Distortion Strength";
  1837.         distortion.default = 1.0;
  1838.         distortion.hint = "This is the amount the noise distorts the image.";
  1839.   
  1840.    
  1841.         style.caption = "Distortion Style";
  1842.         style.default = 0;
  1843.         style.enum = "radial\nlinear";
  1844.         style.hint = "This selects whether the distortion will be focused around a single point, or directed along a line.";
  1845.   
  1846.    
  1847.         distangle.caption = "Distortion Angle";
  1848.         distangle.default = 0.0;
  1849.         distangle.hint = "This is the angle to rotate the distortion.";
  1850.   
  1851.    
  1852.         distcenter.caption = "Distortion Center";
  1853.         distcenter.default = (0,0);
  1854.         distcenter.hint = "Sets the center of distortion.  If Use Screen Center is set, this item is ignored.";
  1855.   
  1856.    
  1857.         centermove.caption = "Use Screen Center";
  1858.         centermove.default = FALSE;
  1859.         centermove.hint = "If set, distortion will be around the center of the window, regardless of the Distortion Center setting.";
  1860.   
  1861.    
  1862.         offset.caption = "Noise Offset";
  1863.         offset.default = (0,0);
  1864.         offset.hint = "This is the offset of the pattern. You can use this to shift the pattern around on the complex plane.";
  1865.   
  1866.    
  1867.         scale.caption = "Noise Scale";
  1868.         scale.default = 1.0;
  1869.         scale.hint = "This is the overall scale of the noise.";
  1870.   
  1871.    
  1872.         Parm_angle.caption = "Noise Rotation";
  1873.         Parm_angle.default = 0.0;
  1874.         Parm_angle.hint = "This is the angle, in degrees, of the noise.";
  1875.   
  1876.    
  1877.         step.caption = "Noise Scale Step";
  1878.         step.default = 0.5;
  1879.         step.hint = "This is the step in scale between noise iterations.";
  1880.   
  1881.    
  1882.         anglestep.caption = "Noise Rotation Step";
  1883.         anglestep.default = 37.0;
  1884.         anglestep.hint = "This is the angle, in degrees, to rotate between noise iterations.";
  1885.   
  1886.    
  1887.         octaves.caption = "Noise Octaves";
  1888.         octaves.default = 7;
  1889.         octaves.min = 1;
  1890.         octaves.hint = "This is the number of iterations of the noise formula.";
  1891.   
  1892.    
  1893.         npower.caption = "Noise Exponent";
  1894.         npower.default = 2.0;
  1895.         npower.hint = "This is the exponent used to scramble numbers.";
  1896.   
  1897.  
  1898.    
  1899.         noisestart.caption = "Start Iteration";
  1900.         noisestart.default = 0.0;
  1901.         noisestart.hint = "This is the iteration at which to start adding noise.";
  1902.   
  1903.    
  1904.         noiseiter.caption = "Noise Iterations";
  1905.         noiseiter.default = 10000.0;
  1906.         noiseiter.hint = "This is the number of iterations to add noise to.";
  1907.   
  1908.    
  1909.         noiseskip.caption = "Skip Iterations";
  1910.         noiseskip.default = 0.0;
  1911.         noiseskip.hint = "This is the number of iterations to skip adding noise before starting again.";
  1912.   
  1913.    
  1914.         coloronly.caption = "Coloring Only";
  1915.         coloronly.default = false;
  1916.         coloronly.hint = "If set, noise will only apply to pixel values passed to the coloring algorithm; it will not be included in the fractal calculation between iterations.";
  1917.   
  1918.  
  1919.     }
  1920. }
  1921.  
  1922.  
  1923. dmj-fBmNovaMandel {
  1924. //
  1925. // This is the basic Nova (Mandelbrot) type, but with a
  1926. // bit of fBm noise added at each iteration. This
  1927. // tends to distort the fractal beyond all recognition
  1928. // after just a few iterations, which may or may not
  1929. // be what you're looking for.
  1930. //
  1931. // You can also use the "Coloring Only" option to
  1932. // restrict the fBm distortion to the value passed
  1933. // to the coloring algorithm; the distortion will be
  1934. // removed before the next iteration is calculated.
  1935. //
  1936. complex zsquared;
  1937. complex zcubed;
  1938. complex zold;
  1939. parameter complex start;
  1940. complex oz;
  1941. complex c;
  1942. parameter complex distcenter;
  1943. parameter bool centermove;
  1944. complex r;
  1945. parameter real Parm_angle;
  1946. complex r2;
  1947. parameter real anglestep;
  1948. complex r3;
  1949. parameter real distangle;
  1950. real fiter;
  1951. parameter real noisestart;
  1952. bool noise;
  1953. parameter real noiseskip;
  1954. parameter real noiseiter;
  1955. parameter bool coloronly;
  1956. parameter complex power;
  1957. parameter complex relax;
  1958. complex p;
  1959. parameter real scale;
  1960. real sum;
  1961. real freq;
  1962. complex v;
  1963. int i;
  1964. parameter real octaves;
  1965. real bx0;
  1966. real by0;
  1967. real bx1;
  1968. real by1;
  1969. real rx0;
  1970. real ry0;
  1971. real rx1;
  1972. real ry1;
  1973. real b00;
  1974. parameter real npower;
  1975. real b10;
  1976. real b01;
  1977. real b11;
  1978. real g_b00_0;
  1979. real g_b10_0;
  1980. real g_b01_0;
  1981. real g_b11_0;
  1982. real g_b00_1;
  1983. real g_b10_1;
  1984. real g_b01_1;
  1985. real g_b11_1;
  1986. real d;
  1987. real u1;
  1988. real v1;
  1989. real u2;
  1990. real v2;
  1991. real sx;
  1992. real sy;
  1993. real a;
  1994. real b;
  1995. parameter real step;
  1996. parameter int style;
  1997. parameter real distortion;
  1998. parameter real bailout;
  1999.  
  2000.     void init(void)
  2001.     {
  2002.         zsquared = (0,0);
  2003.         zcubed = (0,0);
  2004.         zold = (0,0);
  2005.   
  2006.         z = start;
  2007.         oz = z;
  2008.  
  2009.         c = distcenter;
  2010.         if  ((centermove))
  2011.         {
  2012.             c = center;
  2013.         }
  2014.  
  2015.         r = (0,1) ^ (Parm_angle / 90.0);
  2016.         r2 = (0,1) ^ (anglestep / 90.0);
  2017.         r3 = (0,1) ^ (distangle / 90.0);
  2018.   
  2019.         fiter = noisestart;
  2020.         noise = false;
  2021.   
  2022.     }
  2023.     void loop(void)
  2024.     {
  2025.         if  ((noiseskip != 0))
  2026.         {// we are skipping some iterations
  2027.             fiter = fiter - 1;// one less to go before we add noise
  2028.             while  ((fiter < 0.0))
  2029.             {// iterations all used up
  2030.                 if  ((noise))
  2031.                 {// we are currently adding noise
  2032.                     noise = false;// so stop
  2033.                     fiter = fiter + noiseskip;// skip this many iterations
  2034.                 }
  2035.                 else
  2036.                 {
  2037. // we aren't currently adding noise
  2038.                     noise = true;// so start
  2039.                     fiter = fiter + noiseiter;// do this many iterations
  2040.                 }
  2041.             }
  2042.         }
  2043.  
  2044.         if  ((coloronly))
  2045.         {// only using fBm on coloring
  2046.             z = oz;// restore z from un-fBm'ed copy
  2047.         }
  2048.         if  ((power == (3,0)))
  2049.         {// special optimized routine for power 3
  2050.             zsquared = sqr(z);
  2051.             zcubed = zsquared * z;
  2052.             zold = z;
  2053.             z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  2054.         }
  2055.         else
  2056.         {
  2057.  
  2058.             zold = z;
  2059.             z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  2060.         }
  2061.         if  ((coloronly))
  2062.         {// only using fBm on coloring
  2063.             oz = z;
  2064.         }
  2065.  
  2066.         if  ((noiseskip == 0.0 || noise))
  2067.         {// adding noise this iteration
  2068.             p = z * scale * r;//+ @offset
  2069.             sum = 0.0;
  2070.             freq = 1.0;
  2071.             v = (0,0);
  2072.             i = octaves;
  2073.             while  ((i > 0))
  2074.             {
  2075.       // determine integer coordinate for corners of square
  2076.       // surrounding p
  2077.                 bx0 = floor(real(p)) % 256;
  2078.                 by0 = floor(imag(p)) % 256;
  2079.                 if  ((bx0 < 0))
  2080.                 {
  2081.                     bx0 = bx0 + 256;
  2082.                 }
  2083.                 if  ((by0 < 0))
  2084.                 {
  2085.                     by0 = by0 + 256;
  2086.                 }
  2087.                 bx1 = (bx0 + 1) % 256;
  2088.                 by1 = (by0 + 1) % 256;
  2089.  
  2090.                 rx0 = real(p) - floor(real(p));
  2091.                 ry0 = imag(p) - floor(imag(p));
  2092.                 rx1 = rx0 - 1;
  2093.                 ry1 = ry0 - 1;
  2094.       
  2095.       // create a "random" index for each corner
  2096.       // (this is where Intel's version differs from Perlin's;
  2097.       // I used Intel's version because it doesn't require a
  2098.       // pre-computed random table, which is difficult to manage
  2099.       // in UF.)
  2100.                 b00 = (bx0^npower % 65536 + by0)^npower % 65536;
  2101.                 b10 = (bx1^npower % 65536 + by0)^npower % 65536;
  2102.                 b01 = (bx0^npower % 65536 + by1)^npower % 65536;
  2103.                 b11 = (bx1^npower % 65536 + by1)^npower % 65536;
  2104.  
  2105.       // produce a "random" vector for each corner
  2106.                 g_b00_0 = (b00)^npower*0.25 % 512 - 256;
  2107.                 g_b10_0 = (b10)^npower*0.25 % 512 - 256;
  2108.                 g_b01_0 = (b01)^npower*0.25 % 512 - 256;
  2109.                 g_b11_0 = (b11)^npower*0.25 % 512 - 256;
  2110.                 g_b00_1 = (b00+1)^npower*0.25 % 512 - 256;
  2111.                 g_b10_1 = (b10+1)^npower*0.25 % 512 - 256;
  2112.                 g_b01_1 = (b01+1)^npower*0.25 % 512 - 256;
  2113.                 g_b11_1 = (b11+1)^npower*0.25 % 512 - 256;
  2114.       
  2115.       // normalize each vector
  2116.                 d = 0.0;//
  2117.                 d = 1 / sqrt(sqr(g_b00_0) + sqr(g_b00_1));
  2118.                 g_b00_0 = g_b00_0 * d;
  2119.                 g_b00_1 = g_b00_1 * d;
  2120.                 d = 1 / sqrt(sqr(g_b10_0) + sqr(g_b10_1));
  2121.                 g_b10_0 = g_b10_0 * d;
  2122.                 g_b10_1 = g_b10_1 * d;
  2123.                 d = 1 / sqrt(sqr(g_b01_0) + sqr(g_b01_1));
  2124.                 g_b01_0 = g_b01_0 * d;
  2125.                 g_b01_1 = g_b01_1 * d;
  2126.                 d = 1 / sqrt(sqr(g_b11_0) + sqr(g_b11_1));
  2127.                 g_b11_0 = g_b11_0 * d;
  2128.                 g_b11_1 = g_b11_1 * d;
  2129.       
  2130.       // produce colors for each corner
  2131.                 u1 = rx0 * g_b00_0 + ry0 * g_b00_1;
  2132.                 v1 = rx1 * g_b10_0 + ry0 * g_b10_1;
  2133.                 u2 = rx0 * g_b01_0 + ry1 * g_b01_1;
  2134.                 v2 = rx1 * g_b11_0 + ry1 * g_b11_1;
  2135.       
  2136.       // interpolate between corners using
  2137.       // bilinear filtering
  2138.                 sx = sqr(rx0) * (3 - rx0*2);
  2139.                 sy = sqr(ry0) * (3 - ry0*2);
  2140.                 a = u1 + sx*(v1-u1);
  2141.                 b = u2 + sx*(v2-u2);
  2142.       
  2143.                 sum = sum + (a + sy*(b-a))*freq;
  2144.                 freq = freq * step;
  2145.                 p = p * r2 / step;
  2146.                 i = i - 1;
  2147.             }
  2148.  
  2149.             if  ((style == 0))
  2150.             {// radial distortion
  2151.                 v = (z-c)/cabs(z-c) * r3;// use vector based on angle to distortion center
  2152.             }
  2153.             else if  ((style == 1))
  2154.             {// linear distortion
  2155.                 v = r3;// just use rotation vector
  2156.             }
  2157.             z = z + v * sum*0.5*distortion;
  2158.         }
  2159.   
  2160.         if  ((coloronly == false))
  2161.         {// not just using fBm on coloring
  2162.             oz = z;// value for bailout is fBm'ed z
  2163.         }
  2164.   
  2165.     }
  2166.     bool bailout(void)
  2167.     {
  2168.         return(|oz - zold| > bailout);
  2169.  
  2170.     }
  2171.     void description(void)
  2172.     {
  2173.         this.title = "Nova (Mandelbrot) + fBm";
  2174.         this.helpfile = "dmj-pub\dmj-pub-uf-nf.htm";
  2175.         this.maxiter = 1000;
  2176.         this.periodicity = 0;
  2177.         this.center = (-0.5,0);
  2178.         this.magn = 1.5;
  2179.   
  2180.    
  2181.         start.caption = "Start Value";
  2182.         start.default = (1,0);
  2183.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  2184.   
  2185.    
  2186.         power.caption = "Exponent";
  2187.         power.default = (3,0);
  2188.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  2189.   
  2190.    
  2191.         bailout.caption = "Bailout";
  2192.         bailout.default = 0.00001;
  2193.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  2194.   
  2195.    
  2196.         relax.caption = "Relaxation";
  2197.         relax.default = (1,0);
  2198.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2199.   
  2200.  
  2201.    
  2202.         distortion.caption = "Distortion Strength";
  2203.         distortion.default = 1.0;
  2204.         distortion.hint = "This is the amount the noise distorts the image.";
  2205.   
  2206.    
  2207.         style.caption = "Distortion Style";
  2208.         style.default = 0;
  2209.         style.enum = "radial\nlinear";
  2210.         style.hint = "This selects whether the distortion will be focused around a single point, or directed along a line.";
  2211.   
  2212.    
  2213.         distangle.caption = "Distortion Angle";
  2214.         distangle.default = 0.0;
  2215.         distangle.hint = "This is the angle to rotate the distortion.";
  2216.   
  2217.    
  2218.         distcenter.caption = "Distortion Center";
  2219.         distcenter.default = (0,0);
  2220.         distcenter.hint = "Sets the center of distortion.  If Use Screen Center is set, this item is ignored.";
  2221.   
  2222.    
  2223.         centermove.caption = "Use Screen Center";
  2224.         centermove.default = FALSE;
  2225.         centermove.hint = "If set, distortion will be around the center of the window, regardless of the Distortion Center setting.";
  2226.   
  2227.    
  2228.         offset.caption = "Noise Offset";
  2229.         offset.default = (0,0);
  2230.         offset.hint = "This is the offset of the pattern. You can use this to shift the pattern around on the complex plane.";
  2231.   
  2232.    
  2233.         scale.caption = "Noise Scale";
  2234.         scale.default = 1.0;
  2235.         scale.hint = "This is the overall scale of the noise.";
  2236.   
  2237.    
  2238.         Parm_angle.caption = "Noise Rotation";
  2239.         Parm_angle.default = 0.0;
  2240.         Parm_angle.hint = "This is the angle, in degrees, of the noise.";
  2241.   
  2242.    
  2243.         step.caption = "Noise Scale Step";
  2244.         step.default = 0.5;
  2245.         step.hint = "This is the step in scale between noise iterations.";
  2246.   
  2247.    
  2248.         anglestep.caption = "Noise Rotation Step";
  2249.         anglestep.default = 37.0;
  2250.         anglestep.hint = "This is the angle, in degrees, to rotate between noise iterations.";
  2251.   
  2252.    
  2253.         octaves.caption = "Noise Octaves";
  2254.         octaves.default = 7;
  2255.         octaves.min = 1;
  2256.         octaves.hint = "This is the number of iterations of the noise formula.";
  2257.   
  2258.    
  2259.         npower.caption = "Noise Exponent";
  2260.         npower.default = 2.0;
  2261.         npower.hint = "This is the exponent used to scramble numbers.";
  2262.   
  2263.  
  2264.    
  2265.         noisestart.caption = "Start Iteration";
  2266.         noisestart.default = 0.0;
  2267.         noisestart.hint = "This is the iteration at which to start adding noise.";
  2268.   
  2269.    
  2270.         noiseiter.caption = "Noise Iterations";
  2271.         noiseiter.default = 10000.0;
  2272.         noiseiter.hint = "This is the number of iterations to add noise to.";
  2273.   
  2274.    
  2275.         noiseskip.caption = "Skip Iterations";
  2276.         noiseskip.default = 0.0;
  2277.         noiseskip.hint = "This is the number of iterations to skip adding noise before starting again.";
  2278.   
  2279.    
  2280.         coloronly.caption = "Coloring Only";
  2281.         coloronly.default = false;
  2282.         coloronly.hint = "If set, noise will only apply to pixel values passed to the coloring algorithm; it will not be included in the fractal calculation between iterations.";
  2283.   
  2284.  
  2285.     }
  2286. }
  2287.  
  2288.  
  2289. dmj-fBmNovaJulia {
  2290. //
  2291. // This is the basic Nova (Mandelbrot) type, but with a
  2292. // bit of fBm noise added at each iteration. This
  2293. // tends to distort the fractal beyond all recognition
  2294. // after just a few iterations, which may or may not
  2295. // be what you're looking for.
  2296. //
  2297. // You can also use the "Coloring Only" option to
  2298. // restrict the fBm distortion to the value passed
  2299. // to the coloring algorithm; the distortion will be
  2300. // removed before the next iteration is calculated.
  2301. //
  2302. complex zsquared;
  2303. complex zcubed;
  2304. complex zold;
  2305. complex oz;
  2306. complex c;
  2307. parameter complex distcenter;
  2308. parameter bool centermove;
  2309. complex r;
  2310. parameter real Parm_angle;
  2311. complex r2;
  2312. parameter real anglestep;
  2313. complex r3;
  2314. parameter real distangle;
  2315. real fiter;
  2316. parameter real noisestart;
  2317. bool noise;
  2318. parameter real noiseskip;
  2319. parameter real noiseiter;
  2320. parameter bool coloronly;
  2321. parameter complex power;
  2322. parameter complex relax;
  2323. parameter complex seed;
  2324. complex p;
  2325. parameter real scale;
  2326. parameter complex offset;
  2327. real sum;
  2328. real freq;
  2329. complex v;
  2330. int i;
  2331. parameter real octaves;
  2332. real bx0;
  2333. real by0;
  2334. real bx1;
  2335. real by1;
  2336. real rx0;
  2337. real ry0;
  2338. real rx1;
  2339. real ry1;
  2340. real b00;
  2341. parameter real npower;
  2342. real b10;
  2343. real b01;
  2344. real b11;
  2345. real g_b00_0;
  2346. real g_b10_0;
  2347. real g_b01_0;
  2348. real g_b11_0;
  2349. real g_b00_1;
  2350. real g_b10_1;
  2351. real g_b01_1;
  2352. real g_b11_1;
  2353. real d;
  2354. real u1;
  2355. real v1;
  2356. real u2;
  2357. real v2;
  2358. real sx;
  2359. real sy;
  2360. real a;
  2361. real b;
  2362. parameter real step;
  2363. parameter int style;
  2364. parameter real distortion;
  2365. parameter real bailout;
  2366.  
  2367.     void init(void)
  2368.     {
  2369.         zsquared = (0,0);
  2370.         zcubed = (0,0);
  2371.         zold = (0,0);
  2372.   
  2373.         z = pixel;
  2374.         oz = z;
  2375.  
  2376.         c = distcenter;
  2377.         if  ((centermove))
  2378.         {
  2379.             c = center;
  2380.         }
  2381.  
  2382.         r = (0,1) ^ (Parm_angle / 90.0);
  2383.         r2 = (0,1) ^ (anglestep / 90.0);
  2384.         r3 = (0,1) ^ (distangle / 90.0);
  2385.   
  2386.         fiter = noisestart;
  2387.         noise = false;
  2388.   
  2389.     }
  2390.     void loop(void)
  2391.     {
  2392.         if  ((noiseskip != 0))
  2393.         {// we are skipping some iterations
  2394.             fiter = fiter - 1;// one less to go before we add noise
  2395.             while  ((fiter < 0.0))
  2396.             {// iterations all used up
  2397.                 if  ((noise))
  2398.                 {// we are currently adding noise
  2399.                     noise = false;// so stop
  2400.                     fiter = fiter + noiseskip;// skip this many iterations
  2401.                 }
  2402.                 else
  2403.                 {
  2404. // we aren't currently adding noise
  2405.                     noise = true;// so start
  2406.                     fiter = fiter + noiseiter;// do this many iterations
  2407.                 }
  2408.             }
  2409.         }
  2410.  
  2411.         if  ((coloronly))
  2412.         {// only using fBm on coloring
  2413.             z = oz;// restore z from un-fBm'ed copy
  2414.         }
  2415.         if  ((power == (3,0)))
  2416.         {// special optimized routine for power 3
  2417.             zsquared = sqr(z);
  2418.             zcubed = zsquared * z;
  2419.             zold = z;
  2420.             z = z - relax * (zcubed-1) / (3*zsquared) + seed;
  2421.         }
  2422.         else
  2423.         {
  2424.  
  2425.             zold = z;
  2426.             z = z - relax * (z^power-1) / (power * z^(power-1)) + seed;
  2427.         }
  2428.         if  ((coloronly))
  2429.         {// only using fBm on coloring
  2430.             oz = z;
  2431.         }
  2432.  
  2433.         if  ((noiseskip == 0.0 || noise))
  2434.         {// adding noise this iteration
  2435.             p = z * scale * r + offset;
  2436.             sum = 0.0;
  2437.             freq = 1.0;
  2438.             v = (0,0);
  2439.             i = octaves;
  2440.             while  ((i > 0))
  2441.             {
  2442.       // determine integer coordinate for corners of square
  2443.       // surrounding p
  2444.                 bx0 = floor(real(p)) % 256;
  2445.                 by0 = floor(imag(p)) % 256;
  2446.                 if  ((bx0 < 0))
  2447.                 {
  2448.                     bx0 = bx0 + 256;
  2449.                 }
  2450.                 if  ((by0 < 0))
  2451.                 {
  2452.                     by0 = by0 + 256;
  2453.                 }
  2454.                 bx1 = (bx0 + 1) % 256;
  2455.                 by1 = (by0 + 1) % 256;
  2456.  
  2457.                 rx0 = real(p) - floor(real(p));
  2458.                 ry0 = imag(p) - floor(imag(p));
  2459.                 rx1 = rx0 - 1;
  2460.                 ry1 = ry0 - 1;
  2461.       
  2462.       // create a "random" index for each corner
  2463.       // (this is where Intel's version differs from Perlin's;
  2464.       // I used Intel's version because it doesn't require a
  2465.       // pre-computed random table, which is difficult to manage
  2466.       // in UF.)
  2467.                 b00 = (bx0^npower % 65536 + by0)^npower % 65536;
  2468.                 b10 = (bx1^npower % 65536 + by0)^npower % 65536;
  2469.                 b01 = (bx0^npower % 65536 + by1)^npower % 65536;
  2470.                 b11 = (bx1^npower % 65536 + by1)^npower % 65536;
  2471.  
  2472.       // produce a "random" vector for each corner
  2473.                 g_b00_0 = (b00)^npower*0.25 % 512 - 256;
  2474.                 g_b10_0 = (b10)^npower*0.25 % 512 - 256;
  2475.                 g_b01_0 = (b01)^npower*0.25 % 512 - 256;
  2476.                 g_b11_0 = (b11)^npower*0.25 % 512 - 256;
  2477.                 g_b00_1 = (b00+1)^npower*0.25 % 512 - 256;
  2478.                 g_b10_1 = (b10+1)^npower*0.25 % 512 - 256;
  2479.                 g_b01_1 = (b01+1)^npower*0.25 % 512 - 256;
  2480.                 g_b11_1 = (b11+1)^npower*0.25 % 512 - 256;
  2481.       
  2482.       // normalize each vector
  2483.                 d = 0.0;//
  2484.                 d = 1 / sqrt(sqr(g_b00_0) + sqr(g_b00_1));
  2485.                 g_b00_0 = g_b00_0 * d;
  2486.                 g_b00_1 = g_b00_1 * d;
  2487.                 d = 1 / sqrt(sqr(g_b10_0) + sqr(g_b10_1));
  2488.                 g_b10_0 = g_b10_0 * d;
  2489.                 g_b10_1 = g_b10_1 * d;
  2490.                 d = 1 / sqrt(sqr(g_b01_0) + sqr(g_b01_1));
  2491.                 g_b01_0 = g_b01_0 * d;
  2492.                 g_b01_1 = g_b01_1 * d;
  2493.                 d = 1 / sqrt(sqr(g_b11_0) + sqr(g_b11_1));
  2494.                 g_b11_0 = g_b11_0 * d;
  2495.                 g_b11_1 = g_b11_1 * d;
  2496.       
  2497.       // produce colors for each corner
  2498.                 u1 = rx0 * g_b00_0 + ry0 * g_b00_1;
  2499.                 v1 = rx1 * g_b10_0 + ry0 * g_b10_1;
  2500.                 u2 = rx0 * g_b01_0 + ry1 * g_b01_1;
  2501.                 v2 = rx1 * g_b11_0 + ry1 * g_b11_1;
  2502.       
  2503.       // interpolate between corners using
  2504.       // bilinear filtering
  2505.                 sx = sqr(rx0) * (3 - rx0*2);
  2506.                 sy = sqr(ry0) * (3 - ry0*2);
  2507.                 a = u1 + sx*(v1-u1);
  2508.                 b = u2 + sx*(v2-u2);
  2509.       
  2510.                 sum = sum + (a + sy*(b-a))*freq;
  2511.                 freq = freq * step;
  2512.                 p = p * r2 / step;
  2513.                 i = i - 1;
  2514.             }
  2515.  
  2516.             if  ((style == 0))
  2517.             {// radial distortion
  2518.                 v = (z-c)/cabs(z-c) * r3;// use vector based on angle to distortion center
  2519.             }
  2520.             else if  ((style == 1))
  2521.             {// linear distortion
  2522.                 v = r3;// just use rotation vector
  2523.             }
  2524.             z = z + v * sum*0.5*distortion;
  2525.         }
  2526.   
  2527.         if  ((coloronly == false))
  2528.         {// not just using fBm on coloring
  2529.             oz = z;// value for bailout is fBm'ed z
  2530.         }
  2531.   
  2532.     }
  2533.     bool bailout(void)
  2534.     {
  2535.         return(|oz - zold| > bailout);
  2536.  
  2537.     }
  2538.     void description(void)
  2539.     {
  2540.         this.title = "Nova (Julia) + fBm";
  2541.         this.helpfile = "dmj-pub\dmj-pub-uf-nf.htm";
  2542.         this.maxiter = 1000;
  2543.         this.periodicity = 0;
  2544.         this.center = (0,0);
  2545.         this.magn = 1.5;
  2546.   
  2547.    
  2548.         seed.caption = "Julia Seed";
  2549.         seed.default = (0,0);
  2550.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  2551.   
  2552.    
  2553.         power.caption = "Exponent";
  2554.         power.default = (3,0);
  2555.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  2556.   
  2557.    
  2558.         bailout.caption = "Bailout";
  2559.         bailout.default = 0.00001;
  2560.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  2561.   
  2562.    
  2563.         relax.caption = "Relaxation";
  2564.         relax.default = (1,0);
  2565.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2566.   
  2567.  
  2568.    
  2569.         distortion.caption = "Distortion Strength";
  2570.         distortion.default = 1.0;
  2571.         distortion.hint = "This is the amount the noise distorts the image.";
  2572.   
  2573.    
  2574.         style.caption = "Distortion Style";
  2575.         style.default = 0;
  2576.         style.enum = "radial\nlinear";
  2577.         style.hint = "This selects whether the distortion will be focused around a single point, or directed along a line.";
  2578.   
  2579.    
  2580.         distangle.caption = "Distortion Angle";
  2581.         distangle.default = 0.0;
  2582.         distangle.hint = "This is the angle to rotate the distortion.";
  2583.   
  2584.    
  2585.         distcenter.caption = "Distortion Center";
  2586.         distcenter.default = (0,0);
  2587.         distcenter.hint = "Sets the center of distortion.  If Use Screen Center is set, this item is ignored.";
  2588.   
  2589.    
  2590.         centermove.caption = "Use Screen Center";
  2591.         centermove.default = FALSE;
  2592.         centermove.hint = "If set, distortion will be around the center of the window, regardless of the Distortion Center setting.";
  2593.   
  2594.    
  2595.         offset.caption = "Noise Offset";
  2596.         offset.default = (0,0);
  2597.         offset.hint = "This is the offset of the pattern. You can use this to shift the pattern around on the complex plane.";
  2598.   
  2599.    
  2600.         scale.caption = "Noise Scale";
  2601.         scale.default = 1.0;
  2602.         scale.hint = "This is the overall scale of the noise.";
  2603.   
  2604.    
  2605.         Parm_angle.caption = "Noise Rotation";
  2606.         Parm_angle.default = 0.0;
  2607.         Parm_angle.hint = "This is the angle, in degrees, of the noise.";
  2608.   
  2609.    
  2610.         step.caption = "Noise Scale Step";
  2611.         step.default = 0.5;
  2612.         step.hint = "This is the step in scale between noise iterations.";
  2613.   
  2614.    
  2615.         anglestep.caption = "Noise Rotation Step";
  2616.         anglestep.default = 37.0;
  2617.         anglestep.hint = "This is the angle, in degrees, to rotate between noise iterations.";
  2618.   
  2619.    
  2620.         octaves.caption = "Noise Octaves";
  2621.         octaves.default = 7;
  2622.         octaves.min = 1;
  2623.         octaves.hint = "This is the number of iterations of the noise formula.";
  2624.   
  2625.    
  2626.         npower.caption = "Noise Exponent";
  2627.         npower.default = 2.0;
  2628.         npower.hint = "This is the exponent used to scramble numbers.";
  2629.   
  2630.  
  2631.    
  2632.         noisestart.caption = "Start Iteration";
  2633.         noisestart.default = 0.0;
  2634.         noisestart.hint = "This is the iteration at which to start adding noise.";
  2635.   
  2636.    
  2637.         noiseiter.caption = "Noise Iterations";
  2638.         noiseiter.default = 10000.0;
  2639.         noiseiter.hint = "This is the number of iterations to add noise to.";
  2640.   
  2641.    
  2642.         noiseskip.caption = "Skip Iterations";
  2643.         noiseskip.default = 0.0;
  2644.         noiseskip.hint = "This is the number of iterations to skip adding noise before starting again.";
  2645.   
  2646.    
  2647.         coloronly.caption = "Coloring Only";
  2648.         coloronly.default = false;
  2649.         coloronly.hint = "If set, noise will only apply to pixel values passed to the coloring algorithm; it will not be included in the fractal calculation between iterations.";
  2650.   
  2651.  
  2652.     }
  2653. }
  2654.  
  2655.  
  2656. dmj-HNovaIMandel {
  2657. //
  2658. // This is the Halley Nova fractal (Mandelbrot
  2659. // form), a modified Halley-style fractal. This
  2660. // is an adaptation of Paul Derbyshire's Halley
  2661. // Nova formulas for FractInt, which are based
  2662. // on his "Nova" formulas derived from classical
  2663. // Newton's Method fractals.
  2664. //
  2665. // This variant uses Kerry Mitchell's inverted
  2666. // computation so that it works with coloring
  2667. // methods expecting divergent z.
  2668. //
  2669. complex nsquaredplusn;
  2670. parameter complex power;
  2671. complex nsquaredminusn;
  2672. complex zton;
  2673. complex zcurrent;
  2674. parameter complex start;
  2675. parameter complex relax;
  2676. parameter bool fudge;
  2677. parameter real bailout;
  2678.  
  2679.     void init(void)
  2680.     {
  2681.         nsquaredplusn = sqr(power) + power;
  2682.         nsquaredminusn = sqr(power) - power;
  2683.         zton = (0,0);
  2684.   
  2685.         zcurrent = start;
  2686.         z = (0,0);
  2687.   
  2688.     }
  2689.     void loop(void)
  2690.     {
  2691.         zton = zcurrent^power;
  2692.         z = (2*power*zcurrent * (zton-1)) * relax /(nsquaredplusn*zton + nsquaredminusn) - pixel;
  2693.         zcurrent = zcurrent - z;
  2694.         z = 1/z;
  2695.         if  ((fudge == true &&|z| > 4))
  2696.         {// fudging angle
  2697.             z = z * zcurrent/cabs(zcurrent);
  2698.         }
  2699.  
  2700.     }
  2701.     bool bailout(void)
  2702.     {
  2703.         return(|z| < bailout);
  2704.   
  2705.     }
  2706.     void description(void)
  2707.     {
  2708.         this.title = "HalleyNova-I (Mandelbrot)";
  2709.         this.helpfile = "dmj-pub\dmj-pub-uf-hni.htm";
  2710.         this.maxiter = 1000;
  2711.         this.periodicity = 0;
  2712.         this.center = (0,0);
  2713.         this.magn = 1.5;
  2714.   
  2715.    
  2716.         start.caption = "Start Value";
  2717.         start.default = (1,0);
  2718.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  2719.   
  2720.    
  2721.         power.caption = "Exponent";
  2722.         power.default = (3,0);
  2723.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  2724.   
  2725.    
  2726.         bailout.caption = "Bailout";
  2727.         bailout.default = 10000.0;
  2728.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  2729.   
  2730.    
  2731.         relax.caption = "Relaxation";
  2732.         relax.default = (1,0);
  2733.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2734.   
  2735.    
  2736.         fudge.caption = "Fudge z Angle";
  2737.         fudge.default = false;
  2738.         fudge.hint = "Modifies angle of z based on starting point. Turning this on will make decomposition more consistent between iterations, regardless of the root converged on.";
  2739.   
  2740.  
  2741.     }
  2742. }
  2743.  
  2744.  
  2745. dmj-HNovaIJulia {
  2746. //
  2747. // This is the Halley Nova fractal (Julia form),
  2748. // a modified Halley-style fractal. This is an
  2749. // adaptation of Paul Derbyshire's Halley Nova
  2750. // formulas for FractInt, which are based on his
  2751. // "Nova" formulas derived from classical
  2752. // Newton's Method fractals.
  2753. //
  2754. // This variant uses Kerry Mitchell's inverted
  2755. // computation so that it works with coloring
  2756. // methods expecting divergent z.
  2757. //
  2758. complex nsquaredplusn;
  2759. parameter complex power;
  2760. complex nsquaredminusn;
  2761. complex zton;
  2762. complex zcurrent;
  2763. parameter complex relax;
  2764. parameter complex seed;
  2765. parameter bool fudge;
  2766. parameter real bailout;
  2767.  
  2768.     void init(void)
  2769.     {
  2770.         nsquaredplusn = sqr(power) + power;
  2771.         nsquaredminusn = sqr(power) - power;
  2772.         zton = (0,0);
  2773.   
  2774.         zcurrent = pixel;
  2775.         z = (0,0);
  2776.   
  2777.     }
  2778.     void loop(void)
  2779.     {
  2780.         zton = zcurrent^power;
  2781.         z = (2*power*zcurrent * (zton-1)) * relax /(nsquaredplusn*zton + nsquaredminusn) - seed;
  2782.         zcurrent = zcurrent - z;
  2783.         z = 1/z;
  2784.         if  ((fudge == true &&|z| > 4))
  2785.         {// fudging angle
  2786.             z = z * zcurrent/cabs(zcurrent);
  2787.         }
  2788.  
  2789.     }
  2790.     bool bailout(void)
  2791.     {
  2792.         return(|z| < bailout);
  2793.   
  2794.     }
  2795.     void description(void)
  2796.     {
  2797.         this.title = "HalleyNova-I (Julia)";
  2798.         this.helpfile = "dmj-pub\dmj-pub-uf-hni.htm";
  2799.         this.maxiter = 1000;
  2800.         this.periodicity = 0;
  2801.         this.center = (0,0);
  2802.         this.magn = 1.5;
  2803.   
  2804.    
  2805.         seed.caption = "Julia Seed";
  2806.         seed.default = (0,0);
  2807.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  2808.   
  2809.    
  2810.         power.caption = "Exponent";
  2811.         power.default = (3,0);
  2812.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  2813.   
  2814.    
  2815.         bailout.caption = "Bailout";
  2816.         bailout.default = 10000.0;
  2817.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  2818.   
  2819.    
  2820.         relax.caption = "Relaxation";
  2821.         relax.default = (1,0);
  2822.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2823.   
  2824.    
  2825.         fudge.caption = "Fudge z Angle";
  2826.         fudge.default = false;
  2827.         fudge.hint = "Modifies angle of z based on starting point. Turning this on will make decomposition more consistent between iterations, regardless of the root converged on.";
  2828.   
  2829.  
  2830.     }
  2831. }
  2832.  
  2833.  
  2834. dmj-HNovaMandel {
  2835. //
  2836. // This is the Halley Nova fractal (Mandelbrot
  2837. // form), a modified Halley-style fractal. This
  2838. // is an adaptation of Paul Derbyshire's Halley
  2839. // Nova formulas for FractInt, which are based
  2840. // on his "Nova" formulas derived from classical
  2841. // Newton's Method fractals.
  2842. //
  2843. complex nsquaredplusn;
  2844. parameter complex power;
  2845. complex nsquaredminusn;
  2846. complex zton;
  2847. complex zold;
  2848. parameter complex start;
  2849. parameter complex relax;
  2850. parameter real bailout;
  2851.  
  2852.     void init(void)
  2853.     {
  2854.         nsquaredplusn = sqr(power) + power;
  2855.         nsquaredminusn = sqr(power) - power;
  2856.         zton = (0,0);
  2857.         zold = (0,0);
  2858.   
  2859.         z = start;
  2860.   
  2861.     }
  2862.     void loop(void)
  2863.     {
  2864.         zold = z;
  2865.         zton = z^power;
  2866.         z = z - (2*power*z * (zton-1)) * relax / (nsquaredplusn*zton + nsquaredminusn) + pixel;
  2867.  
  2868.     }
  2869.     bool bailout(void)
  2870.     {
  2871.         return(|z - zold| > bailout);
  2872.   
  2873.     }
  2874.     void description(void)
  2875.     {
  2876.         this.title = "HalleyNova (Mandelbrot)";
  2877.         this.helpfile = "dmj-pub\dmj-pub-uf-hn.htm";
  2878.         this.maxiter = 1000;
  2879.         this.periodicity = 0;
  2880.         this.center = (-0.5,0);
  2881.         this.magn = 1.0;
  2882.   
  2883.    
  2884.         start.caption = "Start Value";
  2885.         start.default = (1,0);
  2886.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  2887.   
  2888.    
  2889.         power.caption = "Exponent";
  2890.         power.default = (3,0);
  2891.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic HalleyNovaM type.";
  2892.   
  2893.    
  2894.         bailout.caption = "Bailout";
  2895.         bailout.default = 0.00001;
  2896.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  2897.   
  2898.    
  2899.         relax.caption = "Relaxation";
  2900.         relax.default = (1,0);
  2901.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2902.   
  2903.  
  2904.     }
  2905. }
  2906.  
  2907.  
  2908. dmj-HNovaJulia {
  2909. //
  2910. // This is the Halley Nova fractal (Julia form),
  2911. // a modified Halley-style fractal. This is an
  2912. // adaptation of Paul Derbyshire's Halley Nova
  2913. // formulas for FractInt, which are based on his
  2914. // "Nova" formulas derived from classical
  2915. // Newton's Method fractals.
  2916. //
  2917. complex nsquaredplusn;
  2918. parameter complex power;
  2919. complex nsquaredminusn;
  2920. complex zton;
  2921. complex zold;
  2922. parameter complex relax;
  2923. parameter complex seed;
  2924. parameter real bailout;
  2925.  
  2926.     void init(void)
  2927.     {
  2928.         nsquaredplusn = sqr(power) + power;
  2929.         nsquaredminusn = sqr(power) - power;
  2930.         zton = (0,0);
  2931.         zold = (0,0);
  2932.   
  2933.         z = pixel;
  2934.   
  2935.     }
  2936.     void loop(void)
  2937.     {
  2938.         zold = z;
  2939.         zton = z^power;
  2940.         z = z - (2*power*z * (zton-1)) * relax /(nsquaredplusn*zton + nsquaredminusn) + seed;
  2941.   
  2942.     }
  2943.     bool bailout(void)
  2944.     {
  2945.         return(|z - zold| > bailout);
  2946.   
  2947.     }
  2948.     void description(void)
  2949.     {
  2950.         this.title = "HalleyNova (Julia)";
  2951.         this.helpfile = "dmj-pub\dmj-pub-uf-hn.htm";
  2952.         this.maxiter = 1000;
  2953.         this.periodicity = 0;
  2954.         this.center = (0,0);
  2955.         this.magn = 0.5;
  2956.   
  2957.    
  2958.         seed.caption = "Julia Seed";
  2959.         seed.default = (0,0);
  2960.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  2961.   
  2962.    
  2963.         power.caption = "Exponent";
  2964.         power.default = (3,0);
  2965.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic HalleyNovaJ type.";
  2966.   
  2967.    
  2968.         bailout.caption = "Bailout";
  2969.         bailout.default = 0.00001;
  2970.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  2971.   
  2972.    
  2973.         relax.caption = "Relaxation";
  2974.         relax.default = (1,0);
  2975.         relax.hint = "This can be used to slow down the convergence of the formula.";
  2976.   
  2977.  
  2978.     }
  2979. }
  2980.  
  2981.  
  2982. dmj-IMandel {
  2983. //
  2984. // This is a modified Mandelbrot formula which
  2985. // returns 1/z in z.  This is useful for coloring
  2986. // algorithms which expect convergent orbits.
  2987. //
  2988. parameter complex start;
  2989. parameter complex invcenter;
  2990. complex z2;
  2991. complex z3;
  2992. parameter bool invdelta;
  2993. parameter complex power;
  2994. parameter real bailout;
  2995.  
  2996.     void init(void)
  2997.     {
  2998.         if  ((start == (0,0)))
  2999.         {
  3000.             z = 1 / (pixel-invcenter);
  3001.         }
  3002.         else
  3003.         {
  3004.  
  3005.             z = 1 / (start-invcenter);
  3006.         }
  3007.         z2 = (0,0);
  3008.         z3 = (0,0);
  3009.   
  3010.     }
  3011.     void loop(void)
  3012.     {
  3013.         z = 1/z + invcenter;
  3014.         if  ((invdelta == true))
  3015.         {
  3016.             z = z + z2;
  3017.             z2 = z;
  3018.         }
  3019.         z = z^power + pixel;
  3020.         if  ((invdelta == true))
  3021.         {
  3022.             z = z - z2;
  3023.         }
  3024.         z = 1 / (z-invcenter);
  3025.   
  3026.     }
  3027.     bool bailout(void)
  3028.     {
  3029.         return(|z| > bailout);
  3030.  
  3031.     }
  3032.     void description(void)
  3033.     {
  3034.         this.title = "Mandelbrot (Inverted)";
  3035.         this.helpfile = "dmj-pub\dmj-pub-uf-mji.htm";
  3036.         this.maxiter = 1000;
  3037.         this.center = (-0.5,0);
  3038.   
  3039.    
  3040.         start.caption = "Start Value";
  3041.         start.default = (0,0);
  3042.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  3043.   
  3044.    
  3045.         power.caption = "Exponent";
  3046.         power.default = (2,0);
  3047.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  3048.   
  3049.    
  3050.         bailout.caption = "Bailout";
  3051.         bailout.default = 1.0e-9;
  3052.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.  Note that this is an inverse bailout; larger values make points bail out sooner.";
  3053.   
  3054.    
  3055.         invcenter.caption = "Inversion Center";
  3056.         invcenter.default = (0,0);
  3057.         invcenter.hint = "Center of inversion for calculation.";
  3058.   
  3059.    
  3060.         invdelta.caption = "Use Change in z";
  3061.         invdelta.default = FALSE;
  3062.         invdelta.hint = "If set, z will be the inverted change in orbit values, rather than the inverted orbit value itself.";
  3063.   
  3064.  
  3065.     }
  3066. }
  3067.  
  3068.  
  3069. dmj-IJulia {
  3070. //
  3071. // This is a modified Julia formula which
  3072. // returns 1/z in z.  This is useful for coloring
  3073. // algorithms which expect convergent orbits.
  3074. //
  3075. parameter complex invcenter;
  3076. complex z2;
  3077. complex z3;
  3078. parameter bool invdelta;
  3079. parameter complex power;
  3080. parameter complex seed;
  3081. parameter real bailout;
  3082.  
  3083.     void init(void)
  3084.     {
  3085.         z = 1 / (pixel-invcenter);
  3086.         z2 = (0,0);
  3087.         z3 = (0,0);
  3088.   
  3089.     }
  3090.     void loop(void)
  3091.     {
  3092.         z = 1/z + invcenter;
  3093.         if  ((invdelta == true))
  3094.         {
  3095.             z = z + z2;
  3096.             z2 = z;
  3097.         }
  3098.         z = z^power + seed;
  3099.         if  ((invdelta == true))
  3100.         {
  3101.             z = z - z2;
  3102.         }
  3103.         z = 1 / (z-invcenter);
  3104.   
  3105.     }
  3106.     bool bailout(void)
  3107.     {
  3108.         return(|z| > bailout);
  3109.  
  3110.     }
  3111.     void description(void)
  3112.     {
  3113.         this.title = "Julia (Inverted)";
  3114.         this.helpfile = "dmj-pub\dmj-pub-uf-mji.htm";
  3115.         this.maxiter = 1000;
  3116.         this.center = (0,0);
  3117.   
  3118.    
  3119.         seed.caption = "Julia Seed";
  3120.         seed.default = (0,0);
  3121.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  3122.   
  3123.    
  3124.         power.caption = "Exponent";
  3125.         power.default = (2,0);
  3126.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3127.   
  3128.    
  3129.         bailout.caption = "Bailout";
  3130.         bailout.default = 1.0e-9;
  3131.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.  Note that this is an inverse bailout; larger values make points bail out sooner.";
  3132.   
  3133.    
  3134.         invcenter.caption = "Inversion Center";
  3135.         invcenter.default = (0,0);
  3136.         invcenter.hint = "Center of inversion for calculation.";
  3137.   
  3138.    
  3139.         invdelta.caption = "Use Change in z";
  3140.         invdelta.default = FALSE;
  3141.         invdelta.hint = "If set, z will be the inverted change in orbit values, rather than the inverted orbit value itself.";
  3142.   
  3143.  
  3144.     }
  3145. }
  3146.  
  3147.  
  3148. dmj-Julia2-Start {
  3149. //
  3150. // This is the starting point for Julia2, the periodic-c
  3151. // Julia variant.  Because this is derived from the basic
  3152. // Julia equation, z^2+c, the dmj-Smooth and dmj-Triangle
  3153. // coloring algorithms will work with it.  Use UF2's
  3154. // Switch feature to select the first Julia point.
  3155. //
  3156. parameter complex power;
  3157. parameter real bailout;
  3158.  
  3159.     void init(void)
  3160.     {
  3161.         z = 0;
  3162.  
  3163.     }
  3164.     void loop(void)
  3165.     {
  3166.         z = z^power + pixel;
  3167.  
  3168.     }
  3169.     bool bailout(void)
  3170.     {
  3171.         return(|z| < bailout);
  3172.  
  3173.     }
  3174.     void description(void)
  3175.     {
  3176.         this.title = "Julia2 Start";
  3177.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3178.         this.maxiter = 1000;
  3179.         this.center = (-0.5,0);
  3180.  
  3181.    
  3182.         switchseeds.caption = "Switch Seeds";
  3183.         switchseeds.default = FALSE;
  3184.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped. NOTE: the effects will not be visible at this stage.";
  3185.   
  3186.    
  3187.         pattern.caption = "Seed Pattern";
  3188.         pattern.default = 21;
  3189.         pattern.min = 12;
  3190.         pattern.hint = "Defines the pattern in which the two seeds will be used. NOTE: the effects will not be visible at this stage.";
  3191.   
  3192.    
  3193.         power.caption = "Exponent";
  3194.         power.default = (2,0);
  3195.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3196.   
  3197.    
  3198.         bailout.caption = "Bailout";
  3199.         bailout.default = 1.0e20;
  3200.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia2 set anymore.";
  3201.   
  3202.  
  3203.     }
  3204. }
  3205.  
  3206.  
  3207. dmj-Julia2-Step1 {
  3208. //
  3209. // This is the first step in selecting a Julia2 fractal.  From
  3210. // here, use the Switch feature again to select the second Julia
  3211. // point.
  3212. //
  3213. int p;
  3214. parameter real pattern;
  3215. int plength;
  3216. int pmul;
  3217. int pdigit;
  3218. bool t;
  3219. parameter bool switchseeds;
  3220. parameter complex power;
  3221. parameter complex seed1;
  3222. parameter real bailout;
  3223.  
  3224.     void init(void)
  3225.     {
  3226.         z = 0;
  3227.  
  3228.         p = pattern;// Starting pattern
  3229.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3230.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3231.         pdigit = 0;// used for extracted digit
  3232.         t = false;
  3233.         if  ((p == 21 && switchseeds))
  3234.         {// special optimized pattern
  3235.             t = true;// start with the other seed
  3236.         }
  3237.  
  3238.     }
  3239.     void loop(void)
  3240.     {
  3241.         if  ((p == 21))
  3242.         {// special optimized pattern
  3243.             t = !t;// rotate pattern one step
  3244.             if  ((t))
  3245.             {// using second seed
  3246.                 z = z^power + pixel;
  3247.             }
  3248.             else
  3249.             {
  3250. // using first seed
  3251.                 z = z^power + seed1;
  3252.             }
  3253.  
  3254.         }
  3255.         else
  3256.         {
  3257.  
  3258.             pdigit = floor(p / pmul);// rotate pattern one step
  3259.             p = (p-pdigit*pmul)*10 + pdigit;
  3260.             if  ((switchseeds))
  3261.             {// seeds should be swapped
  3262.                 pdigit = 3 - pdigit;// use the other seed
  3263.             }
  3264.             if  ((pdigit == 1))
  3265.             {// using first seed
  3266.                 z = z^power + seed1;
  3267.             }
  3268.             else
  3269.             {
  3270. // using second seed
  3271.                 z = z^power + pixel;
  3272.             }
  3273.         }
  3274.  
  3275.     }
  3276.     bool bailout(void)
  3277.     {
  3278.         return(|z| < bailout);
  3279.  
  3280.     }
  3281.     void description(void)
  3282.     {
  3283.         this.title = "Julia2 Step 1";
  3284.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3285.         this.maxiter = 1000;
  3286.         this.center = (-0.5,0);
  3287.  
  3288.    
  3289.         seed1.caption = "Julia Seed 1";
  3290.         seed1.default = (0,0);
  3291.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  3292.   
  3293.    
  3294.         switchseeds.caption = "Switch Seeds";
  3295.         switchseeds.default = FALSE;
  3296.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  3297.   
  3298.    
  3299.         pattern.caption = "Seed Pattern";
  3300.         pattern.default = 21;
  3301.         pattern.min = 12;
  3302.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1 or 2; when all digits have been used, the pattern repeats.  The default of 21 gives the original Julia2 behavior.";
  3303.   
  3304.    
  3305.         power.caption = "Exponent";
  3306.         power.default = (2,0);
  3307.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3308.   
  3309.    
  3310.         bailout.caption = "Bailout";
  3311.         bailout.default = 1.0e20;
  3312.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia2 set anymore.";
  3313.   
  3314.  
  3315.     }
  3316. }
  3317.  
  3318.  
  3319. dmj-Julia2-Step2 {
  3320. //
  3321. // This is the final alternating-c Julia2 fractal.
  3322. // Once both seeds have been selected, you can use
  3323. // the Switch feature again to open up a window
  3324. // which will let you select the first Julia seed
  3325. // again, leaving the second one unchanged.
  3326. //
  3327. int p;
  3328. parameter real pattern;
  3329. int plength;
  3330. int pmul;
  3331. int pdigit;
  3332. bool t;
  3333. parameter bool switchseeds;
  3334. parameter complex power;
  3335. parameter complex seed2;
  3336. parameter complex seed1;
  3337. parameter real bailout;
  3338.  
  3339.     void init(void)
  3340.     {
  3341.         z = pixel;
  3342.  
  3343.         p = pattern;// Starting pattern
  3344.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3345.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3346.         pdigit = 0;// used for extracted digit
  3347.         t = false;
  3348.         if  ((p == 21 && switchseeds))
  3349.         {// special optimized pattern
  3350.             t = true;// start with the other seed
  3351.         }
  3352.  
  3353.     }
  3354.     void loop(void)
  3355.     {
  3356.         if  ((p == 21))
  3357.         {// special optimized pattern
  3358.             t = !t;// rotate pattern one step
  3359.             if  ((t))
  3360.             {// using second seed
  3361.                 z = z^power + seed2;
  3362.             }
  3363.             else
  3364.             {
  3365. // using first seed
  3366.                 z = z^power + seed1;
  3367.             }
  3368.  
  3369.         }
  3370.         else
  3371.         {
  3372.  
  3373.             pdigit = floor(p / pmul);// rotate pattern one step
  3374.             p = (p-pdigit*pmul)*10 + pdigit;
  3375.             if  ((switchseeds))
  3376.             {// seeds should be swapped
  3377.                 pdigit = 3 - pdigit;// use the other seed
  3378.             }
  3379.             if  ((pdigit == 1))
  3380.             {// using first seed
  3381.                 z = z^power + seed1;
  3382.             }
  3383.             else
  3384.             {
  3385. // using second seed
  3386.                 z = z^power + seed2;
  3387.             }
  3388.         }
  3389.  
  3390.     }
  3391.     bool bailout(void)
  3392.     {
  3393.         return(|z| < bailout);
  3394.  
  3395.     }
  3396.     void description(void)
  3397.     {
  3398.         this.title = "Julia2 Step 2";
  3399.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3400.         this.maxiter = 1000;
  3401.   
  3402.    
  3403.         seed1.caption = "Julia Seed 1";
  3404.         seed1.default = (0,0);
  3405.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  3406.   
  3407.    
  3408.         seed2.caption = "Julia Seed 2";
  3409.         seed2.default = (0,0);
  3410.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  3411.   
  3412.    
  3413.         switchseeds.caption = "Switch Seeds";
  3414.         switchseeds.default = FALSE;
  3415.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  3416.   
  3417.    
  3418.         pattern.caption = "Seed Pattern";
  3419.         pattern.default = 21;
  3420.         pattern.min = 12;
  3421.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1 or 2; when all digits have been used, the pattern repeats.  The default of 21 gives the original Julia2 behavior.";
  3422.   
  3423.    
  3424.         power.caption = "Exponent";
  3425.         power.default = (2,0);
  3426.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3427.   
  3428.    
  3429.         bailout.caption = "Bailout";
  3430.         bailout.default = 1.0e20;
  3431.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia2 set anymore.";
  3432.   
  3433.  
  3434.     }
  3435. }
  3436.  
  3437.  
  3438. dmj-Julia2-Step1a {
  3439. //
  3440. // This is the first step in selecting a Julia2 fractal.  From
  3441. // here, use the Switch feature again to select the second Julia
  3442. // point.
  3443. //
  3444. int p;
  3445. parameter real pattern;
  3446. int plength;
  3447. int pmul;
  3448. int pdigit;
  3449. bool t;
  3450. parameter bool switchseeds;
  3451. parameter complex power;
  3452. parameter complex seed2;
  3453. parameter real bailout;
  3454.  
  3455.     void init(void)
  3456.     {
  3457.         z = 0;
  3458.  
  3459.         p = pattern;// Starting pattern
  3460.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3461.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3462.         pdigit = 0;// used for extracted digit
  3463.         t = false;
  3464.         if  ((p == 21 && switchseeds))
  3465.         {// special optimized pattern
  3466.             t = true;// start with the other seed
  3467.         }
  3468.  
  3469.     }
  3470.     void loop(void)
  3471.     {
  3472.         if  ((p == 21))
  3473.         {// special optimized pattern
  3474.             t = !t;// rotate pattern one step
  3475.             if  ((t))
  3476.             {// using second seed
  3477.                 z = z^power + seed2;
  3478.             }
  3479.             else
  3480.             {
  3481. // using first seed
  3482.                 z = z^power + pixel;
  3483.             }
  3484.  
  3485.         }
  3486.         else
  3487.         {
  3488.  
  3489.             pdigit = floor(p / pmul);// rotate pattern one step
  3490.             p = (p-pdigit*pmul)*10 + pdigit;
  3491.             if  ((switchseeds))
  3492.             {// seeds should be swapped
  3493.                 pdigit = 3 - pdigit;// use the other seed
  3494.             }
  3495.             if  ((pdigit == 1))
  3496.             {// using first seed
  3497.                 z = z^power + pixel;
  3498.             }
  3499.             else
  3500.             {
  3501. // using second seed
  3502.                 z = z^power + seed2;
  3503.             }
  3504.         }
  3505.  
  3506.     }
  3507.     bool bailout(void)
  3508.     {
  3509.         return(|z| < bailout);
  3510.  
  3511.     }
  3512.     void description(void)
  3513.     {
  3514.         this.title = "Julia2 Step 1a";
  3515.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3516.         this.maxiter = 1000;
  3517.         this.center = (-0.5,0);
  3518.         this.periodicity = 0;
  3519.  
  3520.    
  3521.         seed2.caption = "Julia Seed 2";
  3522.         seed2.default = (0,0);
  3523.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  3524.   
  3525.    
  3526.         switchseeds.caption = "Switch Seeds";
  3527.         switchseeds.default = FALSE;
  3528.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  3529.   
  3530.    
  3531.         pattern.caption = "Seed Pattern";
  3532.         pattern.default = 21;
  3533.         pattern.min = 12;
  3534.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1 or 2; when all digits have been used, the pattern repeats.  The default of 21 gives the original Julia2 behavior.";
  3535.   
  3536.    
  3537.         power.caption = "Exponent";
  3538.         power.default = (2,0);
  3539.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3540.   
  3541.    
  3542.         bailout.caption = "Bailout";
  3543.         bailout.default = 1.0e20;
  3544.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia2 set anymore.";
  3545.   
  3546.  
  3547.     }
  3548. }
  3549.  
  3550.  
  3551. dmj-Julia3-Start {
  3552. //
  3553. // This is the starting point for Julia3, the periodic-c
  3554. // Julia variant.  Because this is derived from the basic
  3555. // Julia equation, z^2+c, the dmj-Smooth and dmj-Triangle
  3556. // coloring algorithms will work with it.  Use UF2's
  3557. // Switch feature to select the first Julia point.
  3558. //
  3559. parameter complex power;
  3560. parameter real bailout;
  3561.  
  3562.     void init(void)
  3563.     {
  3564.         z = 0;
  3565.  
  3566.     }
  3567.     void loop(void)
  3568.     {
  3569.         z = z^power + pixel;
  3570.  
  3571.     }
  3572.     bool bailout(void)
  3573.     {
  3574.         return(|z| < bailout);
  3575.  
  3576.     }
  3577.     void description(void)
  3578.     {
  3579.         this.title = "Julia3 Start";
  3580.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3581.         this.maxiter = 1000;
  3582.         this.center = (-0.5,0);
  3583.  
  3584.    
  3585.         seedorder.caption = "Seed Order";
  3586.         seedorder.default = 6;
  3587.         seedorder.enum = "1, 2, 3\n2, 3, 1\n3, 1, 2\n3, 2, 1\n2, 1, 3\n1, 3, 2\ncustom";
  3588.         seedorder.hint = "Selects the order in which the Julia seeds are used. This parameter is retained for compatibility purposes; new fractals should use 'Custom' and set the order explicitly.";
  3589.   
  3590.    
  3591.         pattern.caption = "Seed Pattern";
  3592.         pattern.default = 123;
  3593.         pattern.min = 12;
  3594.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1, 2, or 3; when all digits have been used, the pattern repeats.  The default of 123 gives the original Julia3 behavior.";
  3595.   
  3596.    
  3597.         power.caption = "Exponent";
  3598.         power.default = (2,0);
  3599.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3600.   
  3601.    
  3602.         bailout.caption = "Bailout";
  3603.         bailout.default = 1.0e20;
  3604.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia3 set anymore.";
  3605.   
  3606.  
  3607.     }
  3608. }
  3609.  
  3610.  
  3611. dmj-Julia3-Step1 {
  3612. //
  3613. // This is the first step in selecting a Julia3 fractal.  From
  3614. // here, use the Switch feature again to select the second Julia
  3615. // point.
  3616. //
  3617. int p;
  3618. parameter real pattern;
  3619. parameter int seedorder;
  3620. int plength;
  3621. int pmul;
  3622. int pdigit;
  3623. parameter complex power;
  3624. parameter complex seed1;
  3625. parameter real bailout;
  3626.  
  3627.     void init(void)
  3628.     {
  3629.         z = 0;
  3630.         p = pattern;// Starting pattern
  3631.         if  ((seedorder == 0))
  3632.         {// Preset pattern
  3633.             p = 123;
  3634.         }
  3635.         else if  ((seedorder == 1))
  3636.         {
  3637.             p = 231;
  3638.         }
  3639.         else if  ((seedorder == 2))
  3640.         {
  3641.             p = 312;
  3642.         }
  3643.         else if  ((seedorder == 3))
  3644.         {
  3645.             p = 321;
  3646.         }
  3647.         else if  ((seedorder == 4))
  3648.         {
  3649.             p = 213;
  3650.         }
  3651.         else if  ((seedorder == 5))
  3652.         {
  3653.             p = 132;
  3654.         }
  3655.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3656.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3657.         pdigit = 0;// used for extracted digit
  3658.  
  3659.     }
  3660.     void loop(void)
  3661.     {
  3662.         pdigit = floor(p / pmul);// rotate pattern one step
  3663.         p = (p-pdigit*pmul)*10 + pdigit;
  3664.         if  ((pdigit == 1))
  3665.         {// using first seed
  3666.             z = z^power + seed1;
  3667.         }
  3668.         else if  ((pdigit == 2))
  3669.         {// using second seed
  3670.             z = z^power + pixel;
  3671.         }
  3672.         else
  3673.         {
  3674. // using third seed
  3675.             z = z^power + pixel;
  3676.         }
  3677.  
  3678.     }
  3679.     bool bailout(void)
  3680.     {
  3681.         return(|z| < bailout);
  3682.  
  3683.     }
  3684.     void description(void)
  3685.     {
  3686.         this.title = "Julia3 Step 1";
  3687.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3688.         this.maxiter = 1000;
  3689.         this.center = (-0.5,0);
  3690.  
  3691.    
  3692.         seed1.caption = "Julia Seed 1";
  3693.         seed1.default = (0,0);
  3694.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  3695.   
  3696.    
  3697.         seedorder.caption = "Seed Order";
  3698.         seedorder.default = 6;
  3699.         seedorder.enum = "1, 2, 3\n2, 3, 1\n3, 1, 2\n3, 2, 1\n2, 1, 3\n1, 3, 2\ncustom";
  3700.         seedorder.hint = "Selects the order in which the Julia seeds are used. This parameter is retained for compatibility purposes; new fractals should use 'Custom' and set the order explicitly.";
  3701.   
  3702.    
  3703.         pattern.caption = "Seed Pattern";
  3704.         pattern.default = 123;
  3705.         pattern.min = 12;
  3706.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1, 2, or 3; when all digits have been used, the pattern repeats.  The default of 123 gives the original Julia3 behavior.";
  3707.   
  3708.    
  3709.         power.caption = "Exponent";
  3710.         power.default = (2,0);
  3711.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3712.   
  3713.    
  3714.         bailout.caption = "Bailout";
  3715.         bailout.default = 1.0e20;
  3716.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia3 set anymore.";
  3717.   
  3718.  
  3719.     }
  3720. }
  3721.  
  3722.  
  3723. dmj-Julia3-Step2 {
  3724. //
  3725. // This is the second step in selecting a Julia3 fractal.  From
  3726. // here, use the Switch feature again to select the third Julia
  3727. // point.
  3728. //
  3729. int p;
  3730. parameter real pattern;
  3731. parameter int seedorder;
  3732. int plength;
  3733. int pmul;
  3734. int pdigit;
  3735. parameter complex power;
  3736. parameter complex seed1;
  3737. parameter complex seed2;
  3738. parameter real bailout;
  3739.  
  3740.     void init(void)
  3741.     {
  3742.         z = 0;
  3743.         p = pattern;// Starting pattern
  3744.         if  ((seedorder == 0))
  3745.         {// Preset pattern
  3746.             p = 123;
  3747.         }
  3748.         else if  ((seedorder == 1))
  3749.         {
  3750.             p = 231;
  3751.         }
  3752.         else if  ((seedorder == 2))
  3753.         {
  3754.             p = 312;
  3755.         }
  3756.         else if  ((seedorder == 3))
  3757.         {
  3758.             p = 321;
  3759.         }
  3760.         else if  ((seedorder == 4))
  3761.         {
  3762.             p = 213;
  3763.         }
  3764.         else if  ((seedorder == 5))
  3765.         {
  3766.             p = 132;
  3767.         }
  3768.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3769.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3770.         pdigit = 0;// used for extracted digit
  3771.  
  3772.     }
  3773.     void loop(void)
  3774.     {
  3775.         pdigit = floor(p / pmul);// rotate pattern one step
  3776.         p = (p-pdigit*pmul)*10 + pdigit;
  3777.         if  ((pdigit == 1))
  3778.         {// using first seed
  3779.             z = z^power + seed1;
  3780.         }
  3781.         else if  ((pdigit == 2))
  3782.         {// using second seed
  3783.             z = z^power + seed2;
  3784.         }
  3785.         else
  3786.         {
  3787. // using third seed
  3788.             z = z^power + pixel;
  3789.         }
  3790.  
  3791.     }
  3792.     bool bailout(void)
  3793.     {
  3794.         return(|z| < bailout);
  3795.  
  3796.     }
  3797.     void description(void)
  3798.     {
  3799.         this.title = "Julia3 Step 2";
  3800.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3801.         this.maxiter = 1000;
  3802.         this.center = (-0.5,0);
  3803.  
  3804.    
  3805.         seed1.caption = "Julia Seed 1";
  3806.         seed1.default = (0,0);
  3807.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  3808.   
  3809.    
  3810.         seed2.caption = "Julia Seed 2";
  3811.         seed2.default = (0,0);
  3812.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  3813.   
  3814.    
  3815.         seedorder.caption = "Seed Order";
  3816.         seedorder.default = 6;
  3817.         seedorder.enum = "1, 2, 3\n2, 3, 1\n3, 1, 2\n3, 2, 1\n2, 1, 3\n1, 3, 2\ncustom";
  3818.         seedorder.hint = "Selects the order in which the Julia seeds are used. This parameter is retained for compatibility purposes; new fractals should use 'Custom' and set the order explicitly.";
  3819.   
  3820.    
  3821.         pattern.caption = "Seed Pattern";
  3822.         pattern.default = 123;
  3823.         pattern.min = 12;
  3824.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1, 2, or 3; when all digits have been used, the pattern repeats.  The default of 123 gives the original Julia3 behavior.";
  3825.   
  3826.    
  3827.         power.caption = "Exponent";
  3828.         power.default = (2,0);
  3829.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3830.   
  3831.    
  3832.         bailout.caption = "Bailout";
  3833.         bailout.default = 1.0e20;
  3834.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia3 set anymore.";
  3835.   
  3836.  
  3837.     }
  3838. }
  3839.  
  3840.  
  3841. dmj-Julia3-Step3 {
  3842. //
  3843. // This is the final alternating-c Julia3 fractal.
  3844. //
  3845. int p;
  3846. parameter real pattern;
  3847. parameter int seedorder;
  3848. int plength;
  3849. int pmul;
  3850. int pdigit;
  3851. parameter complex power;
  3852. parameter complex seed1;
  3853. parameter complex seed2;
  3854. parameter complex seed3;
  3855. parameter real bailout;
  3856.  
  3857.     void init(void)
  3858.     {
  3859.         z = pixel;
  3860.         p = pattern;// Starting pattern
  3861.         if  ((seedorder == 0))
  3862.         {// Preset pattern
  3863.             p = 123;
  3864.         }
  3865.         else if  ((seedorder == 1))
  3866.         {
  3867.             p = 231;
  3868.         }
  3869.         else if  ((seedorder == 2))
  3870.         {
  3871.             p = 312;
  3872.         }
  3873.         else if  ((seedorder == 3))
  3874.         {
  3875.             p = 321;
  3876.         }
  3877.         else if  ((seedorder == 4))
  3878.         {
  3879.             p = 213;
  3880.         }
  3881.         else if  ((seedorder == 5))
  3882.         {
  3883.             p = 132;
  3884.         }
  3885.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  3886.         pmul = floor(10^plength);// multiplier to get leftmost digit
  3887.         pdigit = 0;// used for extracted digit
  3888.  
  3889.     }
  3890.     void loop(void)
  3891.     {
  3892.         pdigit = floor(p / pmul);// rotate pattern one step
  3893.         p = (p-pdigit*pmul)*10 + pdigit;
  3894.         if  ((pdigit == 1))
  3895.         {// using first seed
  3896.             z = z^power + seed1;
  3897.         }
  3898.         else if  ((pdigit == 2))
  3899.         {// using second seed
  3900.             z = z^power + seed2;
  3901.         }
  3902.         else
  3903.         {
  3904. // using third seed
  3905.             z = z^power + seed3;
  3906.         }
  3907.  
  3908.     }
  3909.     bool bailout(void)
  3910.     {
  3911.         return(|z| < bailout);
  3912.  
  3913.     }
  3914.     void description(void)
  3915.     {
  3916.         this.title = "Julia3 Step 3";
  3917.         this.helpfile = "dmj-pub\dmj-pub-uf-j2.htm";
  3918.         this.maxiter = 1000;
  3919.         this.center = (0,0);
  3920.  
  3921.    
  3922.         seed1.caption = "Julia Seed 1";
  3923.         seed1.default = (0,0);
  3924.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  3925.   
  3926.    
  3927.         seed2.caption = "Julia Seed 2";
  3928.         seed2.default = (0,0);
  3929.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  3930.   
  3931.    
  3932.         seed3.caption = "Julia Seed 3";
  3933.         seed3.default = (0,0);
  3934.         seed3.hint = "This is the third Julia seed, a constant parameter which defines the shape of the fractal.";
  3935.   
  3936.    
  3937.         seedorder.caption = "Seed Order";
  3938.         seedorder.default = 6;
  3939.         seedorder.enum = "1, 2, 3\n2, 3, 1\n3, 1, 2\n3, 2, 1\n2, 1, 3\n1, 3, 2\ncustom";
  3940.         seedorder.hint = "Selects the order in which the Julia seeds are used. This parameter is retained for compatibility purposes; new fractals should use 'Custom' and set the order explicitly.";
  3941.   
  3942.    
  3943.         pattern.caption = "Seed Pattern";
  3944.         pattern.default = 123;
  3945.         pattern.min = 12;
  3946.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1, 2, or 3; when all digits have been used, the pattern repeats.  The default of 123 gives the original Julia3 behavior.";
  3947.   
  3948.    
  3949.         power.caption = "Exponent";
  3950.         power.default = (2,0);
  3951.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  3952.   
  3953.    
  3954.         bailout.caption = "Bailout";
  3955.         bailout.default = 1.0e20;
  3956.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia3 set anymore.";
  3957.   
  3958.  
  3959.     }
  3960. }
  3961.  
  3962.  
  3963. dmj-LyapMandel {
  3964. //
  3965. // This fractal iterates the classical Logistics equation,
  3966. // but using complex numbers. It is similar to the
  3967. // MandelLambda type in FractInt, which is the Mandelbrot
  3968. // form of the classic Lambda fractal.
  3969. //
  3970. parameter complex start;
  3971. parameter complex power;
  3972. parameter real bailout;
  3973.  
  3974.     void init(void)
  3975.     {
  3976.         z = start;
  3977.   
  3978.     }
  3979.     void loop(void)
  3980.     {
  3981.         z = pixel*z*(1-z)^(power-1);
  3982.   
  3983.     }
  3984.     bool bailout(void)
  3985.     {
  3986.         return(|z| < bailout);
  3987.  
  3988.     }
  3989.     void description(void)
  3990.     {
  3991.         this.title = "Lambda (Mandelbrot)";
  3992.         this.helpfile = "dmj-pub\dmj-pub-uf-lambda.htm";
  3993.         this.center = (1,0);
  3994.         this.magn = 0.5;
  3995.   
  3996.    
  3997.         start.caption = "Start Value";
  3998.         start.default = (0.5,0);
  3999.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4000.   
  4001.    
  4002.         power.caption = "Exponent";
  4003.         power.default = (2,0);
  4004.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Lambda type.";
  4005.   
  4006.    
  4007.         bailout.caption = "Bailout";
  4008.         bailout.default = 1.0e20;
  4009.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Lambda set anymore.";
  4010.   
  4011.  
  4012.     }
  4013. }
  4014.  
  4015.  
  4016. dmj-LyapJulia {
  4017. //
  4018. // This fractal iterates the classical Logistics equation,
  4019. // but using complex numbers. It is similar to the Lambda
  4020. // type in FractInt. Note that all the Julia sets created
  4021. // with this formula can be recreated with the classical
  4022. // Julia type; however, coloring formulas based on #pixel
  4023. // will produce slightly different results, so it is not
  4024. // completely redundant.
  4025. //
  4026. parameter complex seed;
  4027. parameter complex power;
  4028. parameter real bailout;
  4029.  
  4030.     void init(void)
  4031.     {
  4032.         z = pixel;
  4033.   
  4034.     }
  4035.     void loop(void)
  4036.     {
  4037.         z = seed*z*(1-z)^(power-1);
  4038.   
  4039.     }
  4040.     bool bailout(void)
  4041.     {
  4042.         return(|z| < bailout);
  4043.  
  4044.     }
  4045.     void description(void)
  4046.     {
  4047.         this.title = "Lambda (Julia)";
  4048.         this.helpfile = "dmj-pub\dmj-pub-uf-lambda.htm";
  4049.         this.center = (0.5,0);
  4050.   
  4051.    
  4052.         seed.caption = "Julia Seed";
  4053.         seed.default = (1,0);
  4054.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  4055.   
  4056.    
  4057.         power.caption = "Exponent";
  4058.         power.default = (2,0);
  4059.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  4060.   
  4061.    
  4062.         bailout.caption = "Bailout";
  4063.         bailout.default = 1.0e20;
  4064.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  4065.   
  4066.  
  4067.     }
  4068. }
  4069.  
  4070.  
  4071. dmj-Lyapunov {
  4072. //
  4073. // This is an implementation of Markus-Lyapunov
  4074. // fractals, which iterates the classical Logistics
  4075. // equation, but varying the (normally constant) r
  4076. // value with each iteration, flipping it between
  4077. // two values according to a pattern.
  4078. //
  4079. // This variation allows you to introduce complex
  4080. // elements into r, but doing so substantially slows
  4081. // down the formula (and it is already slow). So far
  4082. // I've not produced any interesting results this way.
  4083. //
  4084. // This formula is designed to work with the Markus-
  4085. // Lyapunov coloring. It also produces only "inside"
  4086. // points, so the Outside coloring settings will have
  4087. // no effect.
  4088. //
  4089. complex s1;
  4090. parameter complex rotation;
  4091. parameter complex seed1;
  4092. complex s2;
  4093. parameter complex seed2;
  4094. real le;
  4095. complex z1;
  4096. parameter int starttype;
  4097. parameter complex start;
  4098. real f1;
  4099. real f2;
  4100. real z2;
  4101. parameter complex power;
  4102. real p;
  4103. parameter real pattern;
  4104. parameter int patterntype;
  4105. int plength;
  4106. real pmul;
  4107. real imul;
  4108. int pdigit;
  4109. int counter;
  4110. parameter real filter;
  4111. parameter int ztype;
  4112. parameter real offset;
  4113.  
  4114.     void init(void)
  4115.     {
  4116.         s1 = real(pixel)*exp(flip(real(rotation)*pi/180)) + seed1;
  4117.         s2 = imag(pixel)*exp(flip(imag(rotation)*pi/180)) + seed2;
  4118. //  float le = 0.0
  4119.         le = 1.0;
  4120.         z1 = (0,0);
  4121.         if  ((starttype == 0))
  4122.         {
  4123.             z1 = start;
  4124.         }
  4125.         else if  ((starttype == 1))
  4126.         {
  4127.             z1 = seed1;
  4128.         }
  4129.         else if  ((starttype == 2))
  4130.         {
  4131.             z1 = seed2;
  4132.         }
  4133.         else if  ((starttype == 3))
  4134.         {
  4135.             z1 = random;
  4136.         }
  4137.         else if  ((starttype == 4))
  4138.         {
  4139.             z1 = pixel;
  4140.         }
  4141.  
  4142.         f1 = 0.0;
  4143.         f2 = 0.0;
  4144.         z2 = 0.0;
  4145.         if  ((rotation == (0,0) && imag(seed1) == 0 && imag(seed2) == 0 && imag(power) == 0))
  4146.         {
  4147.             f1 = real(pixel) + real(seed1);
  4148.             f2 = imag(pixel) + real(seed2);
  4149.             z2 = real(z1);
  4150.         }
  4151.  
  4152.         p = pattern;// Starting pattern
  4153.         if  ((patterntype == 0))
  4154.         {// decimal pattern
  4155.             plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  4156.             pmul = floor(10^plength);// multiplier to get leftmost digit
  4157.             imul = 1/pmul;
  4158.         }
  4159.         else
  4160.         {
  4161.  
  4162.             plength = floor(log(p)/log(2));// number of digits in the pattern, - 1
  4163.             pmul = floor(2^plength);// multiplier to get leftmost digit
  4164.             imul = 1/pmul;
  4165.         }
  4166.         pdigit = 0;// used for extracted digit
  4167.   
  4168.         counter = 0;
  4169.  
  4170.     }
  4171.     void loop(void)
  4172.     {
  4173.         if  ((patterntype == 0))
  4174.         {// decimal pattern
  4175.             pdigit = floor(p * imul);// extract digit
  4176.             p = (p-pdigit*pmul)*10 + pdigit;// rotate pattern one step
  4177.         }
  4178.         else
  4179.         {
  4180. // binary pattern
  4181.             if  ((p >= pmul))
  4182.             {// this bit is 1
  4183.                 pdigit = 2;// extract digit
  4184.                 p = (p-pmul)*2 + 1;// rotate pattern one step
  4185.             }
  4186.             else
  4187.             {
  4188. // this bit is 0
  4189.                 pdigit = 1;// extract digit
  4190.                 p = p * 2;// rotate pattern one step
  4191.             }
  4192.         }
  4193.  
  4194.         if  ((pdigit == 1))
  4195.         {// using first seed
  4196.             if  ((rotation == (0,0) && seed1 == (0,0) && seed2 == (0,0) && imag(power) == 0))
  4197.             {
  4198.                 z2 = f1*z2*(1-z2)^(real(power)-1);
  4199.                 if  ((counter >= filter))
  4200.                 {
  4201. //        le = le + log(abs(f1-2*f1*z2)) - @offset
  4202.                     le = le * (abs(f1-2*f1*z2));
  4203.                 }
  4204.             }
  4205.             else
  4206.             {
  4207.  
  4208.                 z1 = s1*z1*(1-z1)^(power-1);
  4209.                 if  ((counter >= filter))
  4210.                 {
  4211. //        le = le + log(cabs(s1-2*s1*z1)) - @offset
  4212.                     le = le * (cabs(s1-2*s1*z1));
  4213.                 }
  4214.             }
  4215.  
  4216.         }
  4217.         else
  4218.         {
  4219.                                         // using second seed
  4220.             if  ((rotation == (0,0) && seed1 == (0,0) && seed2 == (0,0) && imag(power) == 0))
  4221.             {
  4222.                 z2 = f2*z2*(1-z2)^(real(power)-1);
  4223.                 if  ((counter >= filter))
  4224.                 {
  4225. //        le = le + log(abs(f2-2*f2*z2)) - @offset
  4226.                     le = le * (abs(f2-2*f2*z2));
  4227.                 }
  4228.             }
  4229.             else
  4230.             {
  4231.  
  4232.                 z1 = s2*z1*(1-z1)^(power-1);
  4233.                 if  ((counter >= filter))
  4234.                 {
  4235. //        le = le + log(cabs(s2-2*s2*z1)) - @offset
  4236.                     le = le * (cabs(s2-2*s2*z1));
  4237.                 }
  4238.             }
  4239.         }
  4240.  
  4241.         counter = counter + 1;
  4242.         if  ((ztype == 0))
  4243.         {
  4244. //    z = le
  4245.             z = log(le) - counter*offset;
  4246.         }
  4247.         else if  ((ztype == 1))
  4248.         {
  4249.             if  ((counter == maxit))
  4250.             {
  4251.                 z = log(le) - counter*offset;
  4252.             }
  4253.         }
  4254.         else if  ((ztype == 2))
  4255.         {
  4256.             z = z1;
  4257.         }
  4258.  
  4259.     }
  4260.     bool bailout(void)
  4261.     {
  4262.         return(true);
  4263.  
  4264.     }
  4265.     void description(void)
  4266.     {
  4267.         this.title = "Markus-Lyapunov";
  4268.         this.helpfile = "dmj-pub\dmj-pub-uf-ml.htm";
  4269.         this.periodicity = 0;
  4270.         this.magn = 0.25;
  4271.         this.maxiter = 1000;
  4272.   
  4273.    
  4274.         starttype.caption = "Start Type";
  4275.         starttype.default = 0;
  4276.         starttype.enum = "fixed\nfirst seed\nsecond seed\nrandom\npixel";
  4277.   
  4278.    
  4279.         start.caption = "Start Value";
  4280.         start.default = (0.5,0);
  4281.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4282.   
  4283.    
  4284.         seed1.caption = "X Seed";
  4285.         seed1.default = (0,0);
  4286.   
  4287.    
  4288.         seed2.caption = "Y Seed";
  4289.         seed2.default = (0,0);
  4290.   
  4291.    
  4292.         rotation.caption = "Rotation";
  4293.         rotation.default = (0,0);
  4294.   
  4295.    
  4296.         pattern.caption = "Seed Pattern";
  4297.         pattern.default = 21.0;
  4298.         pattern.min = 1;
  4299.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1 or 2; when all digits have been used, the pattern repeats.";
  4300.   
  4301.    
  4302.         patterntype.caption = "Seed Pattern Type";
  4303.         patterntype.default = 0;
  4304.         patterntype.enum = "decimal\nbinary";
  4305.         patterntype.hint = "Specifies whether the pattern is expressed in decimals (limited to ten digits) or binary (up to 64 digits).";
  4306.   
  4307.    
  4308.         offset.caption = "Coloring Offset";
  4309.         offset.default = 0.0;
  4310.         offset.hint = "Offsets the coloring value, positive values will cause more areas to be colored.";
  4311.   
  4312.    
  4313.         power.caption = "Exponent";
  4314.         power.default = (2,0);
  4315.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Markus-Lyapunov type.";
  4316.   
  4317.    
  4318.         filter.caption = "Filter Iterations";
  4319.         filter.default = 0;
  4320.         filter.hint = "Specifies the number of iterations to skip before calculating the Markus-Lyapunov exponent.";
  4321.   
  4322.    
  4323.         ztype.caption = "Iteration Value";
  4324.         ztype.default = 1;
  4325.         ztype.enum = "Lyapunov exponent\nLyapunov exp (fast)\nfunction value";
  4326.         ztype.hint = "Specifies the value to be given to the coloring algorithm.";
  4327.   
  4328.     }
  4329. }
  4330.  
  4331.  
  4332. dmj-Magnet1Mandel {
  4333. //
  4334. // This is the Type 1 Magnetic fractal as found in
  4335. // FractInt (Mandelbrot form).  You can use the
  4336. // Switch feature to select a Magnet1Julia fractal.
  4337. //
  4338. parameter complex start;
  4339. parameter real bailout;
  4340. parameter real bailout2;
  4341.  
  4342.     void init(void)
  4343.     {
  4344.         z = start;
  4345.   
  4346.     }
  4347.     void loop(void)
  4348.     {
  4349.         z = ( (z^2 + pixel-1) / (2*z + pixel-2) ) ^2;
  4350.   
  4351.     }
  4352.     bool bailout(void)
  4353.     {
  4354.         return(|z| < bailout && |z - 1| > bailout2);
  4355.   
  4356.     }
  4357.     void description(void)
  4358.     {
  4359.         this.title = "Magnet 1 (Mandelbrot)";
  4360.         this.helpfile = "dmj-pub\dmj-pub-uf-magnet.htm";
  4361.         this.maxiter = 1000;
  4362.         this.periodicity = 0;
  4363.         this.center = (1,0);
  4364.         this.magn = 0.5;
  4365.   
  4366.    
  4367.         start.caption = "Start Value";
  4368.         start.default = (0,0);
  4369.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4370.   
  4371.    
  4372.         bailout.caption = "Bailout 1";
  4373.         bailout.default = 128.0;
  4374.         bailout.hint = "Divergent bailout value; larger values will cause more iterations to be done for each point.";
  4375.   
  4376.      
  4377.         bailout2.caption = "Bailout 2";
  4378.         bailout2.default = 0.00001;
  4379.         bailout2.hint = "Convergent bailout value; smaller values will cause more iterations to be done for each point.";
  4380.   
  4381.   
  4382.     }
  4383. }
  4384.  
  4385.  
  4386. dmj-Magnet1Julia {
  4387. //
  4388. // This is the Type 1 Magnetic fractal as found in
  4389. // FractInt (Julia form).  Use the Magnet1Mandel type
  4390. // to select a Julia seed.
  4391. //
  4392. complex zold;
  4393. parameter complex seed;
  4394. parameter real bailout;
  4395. parameter real bailout2;
  4396.  
  4397.     void init(void)
  4398.     {
  4399.         zold = (0,0);
  4400.         z = pixel;
  4401.   
  4402.     }
  4403.     void loop(void)
  4404.     {
  4405.         zold = z;
  4406.         z = ( (z^2 + seed-1) / (2*z + seed-2) ) ^2;
  4407.   
  4408.     }
  4409.     bool bailout(void)
  4410.     {
  4411.         return(|z| < bailout && |z - zold| > bailout2);
  4412.   
  4413.     }
  4414.     void description(void)
  4415.     {
  4416.         this.title = "Magnet 1 (Julia)";
  4417.         this.helpfile = "dmj-pub\dmj-pub-uf-magnet.htm";
  4418.         this.maxiter = 1000;
  4419.         this.periodicity = 0;
  4420.         this.center = (-1,0);
  4421.         this.magn = 0.25;
  4422.   
  4423.    
  4424.         seed.caption = "Julia Seed";
  4425.         seed.default = (0,0);
  4426.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  4427.   
  4428.    
  4429.         bailout.caption = "Bailout 1";
  4430.         bailout.default = 128.0;
  4431.         bailout.hint = "Divergent bailout value; larger values will cause more iterations to be done for each point.";
  4432.   
  4433.    
  4434.         bailout2.caption = "Bailout 2";
  4435.         bailout2.default = 0.00001;
  4436.         bailout2.hint = "Convergent bailout value; smaller values will cause more iterations to be done for each point.";
  4437.   
  4438.   
  4439.     }
  4440. }
  4441.  
  4442.  
  4443. dmj-Magnet2Mandel {
  4444. //
  4445. // This is the Type 2 Magnetic fractal as found in
  4446. // FractInt (Mandelbrot form).  You can use the
  4447. // Switch feature to select a Magnet2Julia fractal.
  4448. //
  4449. parameter complex start;
  4450. parameter real bailout;
  4451. parameter real bailout2;
  4452.  
  4453.     void init(void)
  4454.     {
  4455.         z = start;
  4456.   
  4457.     }
  4458.     void loop(void)
  4459.     {
  4460.         z = ( (z^3 + 3*(pixel-1)*z + (pixel-1)*(pixel-2)) / (3*z^2 + 3*(pixel-2)*z + (pixel-1)*(pixel-2) + 1) ) ^2;
  4461.   
  4462.     }
  4463.     bool bailout(void)
  4464.     {
  4465.         return(|z| < bailout && |z - 1| > bailout2);
  4466.   
  4467.     }
  4468.     void description(void)
  4469.     {
  4470.         this.title = "Magnet 2 (Mandelbrot)";
  4471.         this.helpfile = "dmj-pub\dmj-pub-uf-magnet.htm";
  4472.         this.maxiter = 1000;
  4473.         this.periodicity = 0;
  4474.         this.center = (1,0);
  4475.         this.magn = 0.75;
  4476.   
  4477.    
  4478.         start.caption = "Start Value";
  4479.         start.default = (0,0);
  4480.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4481.   
  4482.    
  4483.         bailout.caption = "Bailout 1";
  4484.         bailout.default = 128.0;
  4485.         bailout.hint = "Divergent bailout value; larger values will cause more iterations to be done for each point.";
  4486.   
  4487.    
  4488.         bailout2.caption = "Bailout 2";
  4489.         bailout2.default = 0.00001;
  4490.         bailout2.hint = "Convergent bailout value; smaller values will cause more iterations to be done for each point.";
  4491.   
  4492.   
  4493.     }
  4494. }
  4495.  
  4496.  
  4497. dmj-Magnet2Julia {
  4498. //
  4499. // This is the Type 2 Magnetic fractal as found in
  4500. // FractInt (Julia form).  Use the Magnet2Mandel type
  4501. // to select a Julia seed.
  4502. //
  4503. complex zold;
  4504. parameter complex seed;
  4505. parameter real bailout;
  4506. parameter real bailout2;
  4507.  
  4508.     void init(void)
  4509.     {
  4510.         zold = (0,0);
  4511.         z = pixel;
  4512.   
  4513.     }
  4514.     void loop(void)
  4515.     {
  4516.         zold = z;
  4517.         z = ( (z^3 + 3*(seed-1)*z + (seed-1)*(seed-2)) / (3*z^2 + 3*(seed-2)*z + (seed-1)*(seed-2) + 1) ) ^2;
  4518.   
  4519.     }
  4520.     bool bailout(void)
  4521.     {
  4522.         return(|z| < bailout && |z - zold| > bailout2);
  4523.   
  4524.     }
  4525.     void description(void)
  4526.     {
  4527.         this.title = "Magnet 2 (Julia)";
  4528.         this.helpfile = "dmj-pub\dmj-pub-uf-magnet.htm";
  4529.         this.maxiter = 1000;
  4530.         this.periodicity = 0;
  4531.         this.center = (-1,0);
  4532.         this.magn = 0.125;
  4533.   
  4534.    
  4535.         seed.caption = "Julia Seed";
  4536.         seed.default = (0,0);
  4537.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  4538.   
  4539.    
  4540.         bailout.caption = "Bailout 1";
  4541.         bailout.default = 128.0;
  4542.         bailout.hint = "Divergent bailout value; larger values will cause more iterations to be done for each point.";
  4543.   
  4544.    
  4545.         bailout2.caption = "Bailout 2";
  4546.         bailout2.default = 0.00001;
  4547.         bailout2.hint = "Convergent bailout value; smaller values will cause more iterations to be done for each point.";
  4548.   
  4549.   
  4550.     }
  4551. }
  4552.  
  4553.  
  4554. dmj-Mandel-Nova {
  4555. //
  4556. // Mandelbrot-Nova alternator.
  4557. // This fractal switches between the Mandelbrot
  4558. // and Nova formulas with each iteration.
  4559. //
  4560. // Note: there is a slight logic error in dealing
  4561. // with iteration counts less than 1. The results
  4562. // may not be exactly what you expect. Because
  4563. // I have some images which rely on this behavior,
  4564. // I have not fixed it.
  4565. //
  4566. parameter complex start;
  4567. bool bail;
  4568. bool mset;
  4569. real switch;
  4570. parameter real mswitch;
  4571. complex zold;
  4572. complex nseed1;
  4573. parameter complex nseed;
  4574. parameter int ntype;
  4575. parameter complex mpower;
  4576. parameter real mbailout;
  4577. parameter complex npower;
  4578. complex zsquared;
  4579. complex zcubed;
  4580. parameter real relax;
  4581. parameter real nbailout;
  4582. parameter real nswitch;
  4583.  
  4584.     void init(void)
  4585.     {
  4586.         z = start;
  4587.         bail = false;
  4588.         mset = true;
  4589.         switch = mswitch;
  4590.         zold = (0,0);
  4591.         nseed1 = nseed;
  4592.         if  ((ntype == 0))
  4593.         {
  4594.             nseed1 = pixel;
  4595.         }
  4596.   
  4597.     }
  4598.     void loop(void)
  4599.     {
  4600.         if  ((mset == true))
  4601.         {// do M-set equation this time
  4602.             z = z^mpower + pixel;
  4603.             if  ((|z| > mbailout))
  4604.             {// this point has bailed out
  4605.                 bail = true;
  4606.             }
  4607.  
  4608.         }
  4609.         else
  4610.         {
  4611. // do Nova equation this time
  4612.             if  ((npower == (3,0)))
  4613.             {// special optimized routine for power 3
  4614.                 zsquared = sqr(z);
  4615.                 zcubed = zsquared * z;
  4616.                 zold = z;
  4617.                 z = z - relax * (zcubed-1) / (3*zsquared) + nseed1;
  4618.             }
  4619.             else
  4620.             {
  4621.  
  4622.                 zold = z;
  4623.                 z = z - relax * (z^npower-1) / (npower * z^(npower-1)) + nseed1;
  4624.             }
  4625.             if  ((|z-zold| < nbailout))
  4626.             {// this point has bailed out
  4627.                 bail = true;
  4628.             }
  4629.         }
  4630.  
  4631.         switch = switch - 1;
  4632.         if  ((switch < 0))
  4633.         {
  4634.             if  ((mset == true))
  4635.             {
  4636.                 mset = false;
  4637.                 switch = switch + nswitch;
  4638.             }
  4639.             else
  4640.             {
  4641.  
  4642.                 mset = true;
  4643.                 switch = switch + mswitch;
  4644.             }
  4645.         }
  4646.  
  4647.     }
  4648.     bool bailout(void)
  4649.     {
  4650.         return(bail == false);
  4651.  
  4652.     }
  4653.     void description(void)
  4654.     {
  4655.         this.title = "Mandelbrot-Nova";
  4656.         this.helpfile = "dmj-pub\dmj-pub-uf-mn.htm";
  4657.         this.maxiter = 1000;
  4658.   
  4659.    
  4660.         start.caption = "Start Value";
  4661.         start.default = (0,0);
  4662.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4663.   
  4664.    
  4665.         mpower.caption = "M-Set Exponent";
  4666.         mpower.default = (2,0);
  4667.         mpower.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  4668.   
  4669.    
  4670.         mbailout.caption = "M-Set Bailout";
  4671.         mbailout.default = 1.0e20;
  4672.         mbailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  4673.   
  4674.    
  4675.         nseed.caption = "Nova Julia Seed";
  4676.         nseed.default = (0,0);
  4677.         nseed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  4678.   
  4679.    
  4680.         npower.caption = "Nova Exponent";
  4681.         npower.default = (3,0);
  4682.         npower.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  4683.   
  4684.    
  4685.         nbailout.caption = "Nova Bailout";
  4686.         nbailout.default = 1.0e-9;
  4687.         nbailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  4688.   
  4689.    
  4690.         relax.caption = "Relaxation";
  4691.         relax.default = 1.0;
  4692.         relax.hint = "This can be used to slow down the convergence of the formula.";
  4693.   
  4694.    
  4695.         ntype.caption = "Nova Type";
  4696.         ntype.default = 0;
  4697.         ntype.enum = "Mandelbrot\nJulia";
  4698.         ntype.hint = "Type of Nova fractal to use.";
  4699.   
  4700.    
  4701.         mswitch.caption = "M-set Iterations";
  4702.         mswitch.default = 1.0;
  4703.         mswitch.hint = "Do this many iterations using the M-set equation before switching to the Nova equation.";
  4704.   
  4705.    
  4706.         nswitch.caption = "Nova Iterations";
  4707.         nswitch.default = 1.0;
  4708.         nswitch.hint = "Do this many iterations using the Nova equation before switching to the M-set equation.";
  4709.   
  4710.     }
  4711. }
  4712.  
  4713.  
  4714. dmj-ManyJulia {
  4715. //
  4716. // This formula breaks the image up into a grid of
  4717. // squares, each square containing a small Julia set
  4718. // using the c value from the center of the square.
  4719. // As the size of the grid is reduced, the image will
  4720. // approach that of the Mandelbrot set.
  4721. //
  4722. real iscale;
  4723. parameter real scale;
  4724. complex c;
  4725. parameter real jscale;
  4726. parameter complex power;
  4727. parameter real bailout;
  4728.  
  4729.     void init(void)
  4730.     {
  4731.         iscale = 1 / scale;
  4732.         c = round(pixel * scale) * iscale;
  4733.         z = (pixel - c) * scale * jscale;
  4734.  
  4735.     }
  4736.     void loop(void)
  4737.     {
  4738.         z = z^power + c;
  4739.   
  4740.     }
  4741.     bool bailout(void)
  4742.     {
  4743.         return(|z| < bailout);
  4744.   
  4745.     }
  4746.     void description(void)
  4747.     {
  4748.         this.title = "ManyJulia";
  4749.         this.helpfile = "dmj-pub\dmj-pub-uf-manyjulia.htm";
  4750.         this.maxiter = 1000;
  4751.         this.center = (-0.5,0);
  4752.         this.magn = 1.0;
  4753.   
  4754.    
  4755.         power.caption = "Exponent";
  4756.         power.default = (2,0);
  4757.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  4758.   
  4759.    
  4760.         bailout.caption = "Bailout";
  4761.         bailout.default = 1.0e20;
  4762.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  4763.   
  4764.    
  4765.         scale.caption = "Julia Density";
  4766.         scale.default = 2.0;
  4767.         scale.hint = "Specifies the density of separate Julia sets; higher numbers will produce more divisions.";
  4768.   
  4769.    
  4770.         jscale.caption = "Julia Zoom";
  4771.         jscale.default = 3.0;
  4772.         jscale.hint = "Specifies the zoom level of Julia sets within each division.";
  4773.   
  4774.     }
  4775. }
  4776.  
  4777.  
  4778. dmj-ManyNova {
  4779. //
  4780. // This formula breaks the image up into a grid of
  4781. // squares, each square containing a small Nova Julia set
  4782. // using the c value from the center of the square.
  4783. //
  4784. real iscale;
  4785. parameter real scale;
  4786. complex c;
  4787. parameter real jscale;
  4788. complex zsquared;
  4789. complex zcubed;
  4790. complex zold;
  4791. parameter complex power;
  4792. parameter complex relax;
  4793. parameter real bailout;
  4794.  
  4795.     void init(void)
  4796.     {
  4797.         iscale = 1 / scale;
  4798.         c = round(pixel * scale) * iscale;
  4799.         z = (pixel - c) * scale * jscale;
  4800.  
  4801.         zsquared = (0,0);
  4802.         zcubed = (0,0);
  4803.         zold = (0,0);
  4804.   
  4805.     }
  4806.     void loop(void)
  4807.     {
  4808.         if  ((power == (3,0)))
  4809.         {// special optimized routine for power 3
  4810.             zsquared = sqr(z);
  4811.             zcubed = zsquared * z;
  4812.             zold = z;
  4813.             z = z - relax * (zcubed-1) / (3*zsquared) + c;
  4814.         }
  4815.         else
  4816.         {
  4817.  
  4818.             zold = z;
  4819.             z = z - relax * (z^power-1) / (power * z^(power-1)) + c;
  4820.         }
  4821.   
  4822.     }
  4823.     bool bailout(void)
  4824.     {
  4825.         return(|z-zold| > bailout);
  4826.     
  4827.     }
  4828.     void description(void)
  4829.     {
  4830.         this.title = "ManyNova";
  4831.         this.helpfile = "dmj-pub\dmj-pub-uf-manynova.htm";
  4832.         this.maxiter = 1000;
  4833.         this.periodicity = 0;
  4834.         this.center = (0,0);
  4835.         this.magn = 1.0;
  4836.   
  4837.    
  4838.         power.caption = "Exponent";
  4839.         power.default = (3,0);
  4840.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  4841.   
  4842.    
  4843.         bailout.caption = "Bailout";
  4844.         bailout.default = 0.00001;
  4845.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  4846.   
  4847.    
  4848.         relax.caption = "Relaxation";
  4849.         relax.default = (1,0);
  4850.         relax.hint = "This can be used to slow down the convergence of the formula.";
  4851.   
  4852.    
  4853.         scale.caption = "Julia Density";
  4854.         scale.default = 2.0;
  4855.         scale.hint = "Specifies the density of separate Julia sets; higher numbers will produce more divisions.";
  4856.   
  4857.    
  4858.         jscale.caption = "Julia Zoom";
  4859.         jscale.default = 3.0;
  4860.         jscale.hint = "Specifies the zoom level of Julia sets within each division.";
  4861.   
  4862.     }
  4863. }
  4864.  
  4865.  
  4866. dmj-NovaIMandel {
  4867. //
  4868. // This is the Nova fractal (Mandelbrot form), a
  4869. // modified Newtonian-style fractal.  The formula
  4870. // was first shown to me by Paul Derbyshire (who
  4871. // named it Nova).  It has also appeared elsewhere
  4872. // under other names.  Use this formula and the
  4873. // Switch feature to select a Nova Julia.
  4874. //
  4875. // This variant uses Kerry Mitchell's inverted
  4876. // computation so that it works with coloring
  4877. // methods expecting divergent z.
  4878. //
  4879. complex zsquared;
  4880. complex zcubed;
  4881. complex zcurrent;
  4882. parameter complex start;
  4883. parameter complex power;
  4884. parameter complex relax;
  4885. parameter bool fudge;
  4886. parameter real bailout;
  4887.  
  4888.     void init(void)
  4889.     {
  4890.         zsquared = (0,0);
  4891.         zcubed = (0,0);
  4892.  
  4893.         zcurrent = start;
  4894.         z = (0,0);
  4895.   
  4896.     }
  4897.     void loop(void)
  4898.     {
  4899.         if  ((power == (3,0)))
  4900.         {// special optimized routine for power 3
  4901.             zsquared = sqr(zcurrent);
  4902.             zcubed = zsquared * zcurrent;
  4903.             z = relax * (zcubed-1) / (3*zsquared) - pixel;
  4904.             zcurrent = zcurrent - z;
  4905.             z = 1/z;
  4906.         }
  4907.         else
  4908.         {
  4909.  
  4910.             z = relax * (zcurrent^power-1) / (power * zcurrent^(power-1)) - pixel;
  4911.             zcurrent = zcurrent - z;
  4912.             z = 1/z;
  4913.         }
  4914.         if  ((fudge == true &&|z| > 4))
  4915.         {// fudging angle
  4916.             z = z * zcurrent/cabs(zcurrent);
  4917.         }
  4918.   
  4919.     }
  4920.     bool bailout(void)
  4921.     {
  4922.         return(|z| < bailout);
  4923.   
  4924.     }
  4925.     void description(void)
  4926.     {
  4927.         this.title = "Nova-I (Mandelbrot)";
  4928.         this.helpfile = "dmj-pub\dmj-pub-uf-ni.htm";
  4929.         this.maxiter = 1000;
  4930.         this.periodicity = 0;
  4931.         this.center = (-0.5,0);
  4932.         this.magn = 1.5;
  4933.   
  4934.    
  4935.         start.caption = "Start Value";
  4936.         start.default = (1,0);
  4937.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  4938.   
  4939.    
  4940.         power.caption = "Exponent";
  4941.         power.default = (3,0);
  4942.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  4943.   
  4944.    
  4945.         bailout.caption = "Bailout";
  4946.         bailout.default = 10000.0;
  4947.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  4948.   
  4949.    
  4950.         relax.caption = "Relaxation";
  4951.         relax.default = (1,0);
  4952.         relax.hint = "This can be used to slow down the convergence of the formula.";
  4953.   
  4954.    
  4955.         fudge.caption = "Fudge z Angle";
  4956.         fudge.default = false;
  4957.         fudge.hint = "Modifies angle of z based on starting point. Turning this on will make decomposition more consistent between iterations, regardless of the root converged on.";
  4958.   
  4959.  
  4960.     }
  4961. }
  4962.  
  4963.  
  4964. dmj-NovaIJulia {
  4965. //
  4966. // This is the Nova fractal (Julia form), a
  4967. // modified Newtonian-style fractal.  The formula
  4968. // was first shown to me by Paul Derbyshire (who
  4969. // named it Nova).  It has also appeared elsewhere
  4970. // under other names.  If you leave the Julia
  4971. // seed at the default (0,0), you can use this as
  4972. // a general Newton-style fractal as in FractInt.
  4973. //
  4974. // This variant uses Kerry Mitchell's inverted
  4975. // computation so that it works with coloring
  4976. // methods expecting divergent z.
  4977. //
  4978. complex zsquared;
  4979. complex zcubed;
  4980. complex zcurrent;
  4981. parameter complex power;
  4982. parameter complex relax;
  4983. parameter complex seed;
  4984. parameter bool fudge;
  4985. parameter real bailout;
  4986.  
  4987.     void init(void)
  4988.     {
  4989.         zsquared = (0,0);
  4990.         zcubed = (0,0);
  4991.  
  4992.         zcurrent = pixel;
  4993.         z = (0,0);
  4994.   
  4995.     }
  4996.     void loop(void)
  4997.     {
  4998.         if  ((power == (3,0)))
  4999.         {// special optimized routine for power 3
  5000.             zsquared = sqr(zcurrent);
  5001.             zcubed = zsquared * zcurrent;
  5002.             z = relax * (zcubed-1) / (3*zsquared) - seed;
  5003.             zcurrent = zcurrent - z;
  5004.             z = 1/z;
  5005.         }
  5006.         else
  5007.         {
  5008.  
  5009.             z = relax * (zcurrent^power-1) / (power * zcurrent^(power-1)) - seed;
  5010.             zcurrent = zcurrent - z;
  5011.             z = 1/z;
  5012.         }
  5013.         if  ((fudge == true &&|z| > 4))
  5014.         {// fudging angle
  5015.             z = z * zcurrent/cabs(zcurrent);
  5016.         }
  5017.   
  5018.     }
  5019.     bool bailout(void)
  5020.     {
  5021.         return(|z| < bailout);
  5022.   
  5023.     }
  5024.     void description(void)
  5025.     {
  5026.         this.title = "Nova-I (Julia)";
  5027.         this.helpfile = "dmj-pub\dmj-pub-uf-ni.htm";
  5028.         this.maxiter = 1000;
  5029.         this.periodicity = 0;
  5030.         this.center = (0,0);
  5031.         this.magn = 1.5;
  5032.   
  5033.    
  5034.         seed.caption = "Julia Seed";
  5035.         seed.default = (0,0);
  5036.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  5037.   
  5038.    
  5039.         power.caption = "Exponent";
  5040.         power.default = (3,0);
  5041.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  5042.   
  5043.    
  5044.         bailout.caption = "Bailout";
  5045.         bailout.default = 10000.0;
  5046.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  5047.   
  5048.    
  5049.         relax.caption = "Relaxation";
  5050.         relax.default = (1,0);
  5051.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5052.   
  5053.    
  5054.         fudge.caption = "Fudge z Angle";
  5055.         fudge.default = false;
  5056.         fudge.hint = "Modifies angle of z based on starting point. Turning this on will make decomposition more consistent between iterations, regardless of the root converged on.";
  5057.   
  5058.  
  5059.     }
  5060. }
  5061.  
  5062.  
  5063. dmj-NovaMandel {
  5064. //
  5065. // This is the Nova fractal (Mandelbrot form), a
  5066. // modified Newtonian-style fractal.  The formula
  5067. // was first shown to me by Paul Derbyshire (who
  5068. // named it Nova).  It has also appeared elsewhere
  5069. // under other names.  Use this formula and the
  5070. // Switch feature to select a NovaJulia.
  5071. //
  5072. complex zsquared;
  5073. complex zcubed;
  5074. complex zold;
  5075. parameter complex start;
  5076. parameter complex power;
  5077. parameter complex relax;
  5078. parameter real bailout;
  5079.  
  5080.     void init(void)
  5081.     {
  5082.         zsquared = (0,0);
  5083.         zcubed = (0,0);
  5084.         zold = (0,0);
  5085.   
  5086.         z = start;
  5087.   
  5088.     }
  5089.     void loop(void)
  5090.     {
  5091.         if  ((power == (3,0)))
  5092.         {// special optimized routine for power 3
  5093.             zsquared = sqr(z);
  5094.             zcubed = zsquared * z;
  5095.             zold = z;
  5096.             z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  5097.         }
  5098.         else
  5099.         {
  5100.  
  5101.             zold = z;
  5102.             z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  5103.         }
  5104.   
  5105.     }
  5106.     bool bailout(void)
  5107.     {
  5108.         return(|z - zold| > bailout);
  5109.   
  5110.     }
  5111.     void description(void)
  5112.     {
  5113.         this.title = "Nova (Mandelbrot)";
  5114.         this.helpfile = "dmj-pub\dmj-pub-uf-nova.htm";
  5115.         this.maxiter = 1000;
  5116.         this.periodicity = 0;
  5117.         this.center = (-0.5,0);
  5118.         this.magn = 1.5;
  5119.   
  5120.    
  5121.         start.caption = "Start Value";
  5122.         start.default = (1,0);
  5123.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  5124.   
  5125.    
  5126.         power.caption = "Exponent";
  5127.         power.default = (3,0);
  5128.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  5129.   
  5130.    
  5131.         bailout.caption = "Bailout";
  5132.         bailout.default = 0.00001;
  5133.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5134.   
  5135.    
  5136.         relax.caption = "Relaxation";
  5137.         relax.default = (1,0);
  5138.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5139.   
  5140.  
  5141.     }
  5142. }
  5143.  
  5144.  
  5145. dmj-NovaJulia {
  5146. //
  5147. // This is the Nova fractal (Julia form), a
  5148. // modified Newtonian-style fractal.  The formula
  5149. // was first shown to me by Paul Derbyshire (who
  5150. // named it Nova).  It has also appeared elsewhere
  5151. // under other names.  If you leave the Julia
  5152. // seed at the default (0,0), you can use this as
  5153. // a general Newton-style fractal as in FractInt.
  5154. //
  5155. complex zsquared;
  5156. complex zcubed;
  5157. complex zold;
  5158. parameter complex power;
  5159. parameter complex relax;
  5160. parameter complex seed;
  5161. parameter real bailout;
  5162.  
  5163.     void init(void)
  5164.     {
  5165.         zsquared = (0,0);
  5166.         zcubed = (0,0);
  5167.         zold = (0,0);
  5168.   
  5169.         z = pixel;
  5170.   
  5171.     }
  5172.     void loop(void)
  5173.     {
  5174.         if  ((power == (3,0)))
  5175.         {// special optimized routine for power 3
  5176.             zsquared = sqr(z);
  5177.             zcubed = zsquared * z;
  5178.             zold = z;
  5179.             z = z - relax * (zcubed-1) / (3*zsquared) + seed;
  5180.         }
  5181.         else
  5182.         {
  5183.  
  5184.             zold = z;
  5185.             z = z - relax * (z^power-1) / (power * z^(power-1)) + seed;
  5186.         }
  5187.   
  5188.     }
  5189.     bool bailout(void)
  5190.     {
  5191.         return(|z - zold| > bailout);
  5192.   
  5193.     }
  5194.     void description(void)
  5195.     {
  5196.         this.title = "Nova (Julia)";
  5197.         this.helpfile = "dmj-pub\dmj-pub-uf-nova.htm";
  5198.         this.maxiter = 1000;
  5199.         this.periodicity = 0;
  5200.         this.center = (0,0);
  5201.         this.magn = 1.5;
  5202.   
  5203.    
  5204.         seed.caption = "Julia Seed";
  5205.         seed.default = (0,0);
  5206.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  5207.   
  5208.    
  5209.         power.caption = "Exponent";
  5210.         power.default = (3,0);
  5211.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  5212.   
  5213.    
  5214.         bailout.caption = "Bailout";
  5215.         bailout.default = 0.00001;
  5216.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5217.   
  5218.    
  5219.         relax.caption = "Relaxation";
  5220.         relax.default = (1,0);
  5221.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5222.   
  5223.  
  5224.     }
  5225. }
  5226.  
  5227.  
  5228. dmj-NovaJulia2-Start {
  5229. //
  5230. // This is the starting point for Nova Julia2, the
  5231. // periodic-c Nova Julia variant.  Use UF2's
  5232. // Switch feature to select the first Julia point.
  5233. //
  5234. complex zsquared;
  5235. complex zcubed;
  5236. complex zold;
  5237. parameter complex power;
  5238. parameter complex relax;
  5239. parameter real bailout;
  5240.  
  5241.     void init(void)
  5242.     {
  5243.         zsquared = (0,0);
  5244.         zcubed = (0,0);
  5245.         zold = (0,0);
  5246.   
  5247.         z = (1,0);
  5248.  
  5249.     }
  5250.     void loop(void)
  5251.     {
  5252.         if  ((power == (3,0)))
  5253.         {// special optimized routine for power 3
  5254.             zsquared = sqr(z);
  5255.             zcubed = zsquared * z;
  5256.             zold = z;
  5257.             z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  5258.         }
  5259.         else
  5260.         {
  5261.  
  5262.             zold = z;
  5263.             z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  5264.         }
  5265.  
  5266.     }
  5267.     bool bailout(void)
  5268.     {
  5269.         return(|z - zold| > bailout);
  5270.  
  5271.     }
  5272.     void description(void)
  5273.     {
  5274.         this.title = "Nova Julia2 Start";
  5275.         this.helpfile = "dmj-pub\dmj-pub-uf-nj2.htm";
  5276.         this.maxiter = 1000;
  5277.         this.periodicity = 0;
  5278.         this.center = (-0.5,0);
  5279.         this.magn = 1.5;
  5280.  
  5281.    
  5282.         switchseeds.caption = "Switch Seeds";
  5283.         switchseeds.default = FALSE;
  5284.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped. NOTE: the effects will not be visible at this stage.";
  5285.   
  5286. //  param pattern
  5287. //    caption = "Seed Pattern"
  5288. //    default = 21
  5289. //    min = 12
  5290. //    hint = "Defines the pattern in which the two seeds will be used. ;            NOTE: the effects will not be visible at this stage."
  5291. //  endparam
  5292.    
  5293.         power.caption = "Exponent";
  5294.         power.default = (3,0);
  5295.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  5296.   
  5297.    
  5298.         bailout.caption = "Bailout";
  5299.         bailout.default = 0.00001;
  5300.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5301.   
  5302.    
  5303.         relax.caption = "Relaxation";
  5304.         relax.default = (1,0);
  5305.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5306.   
  5307.  
  5308.     }
  5309. }
  5310.  
  5311.  
  5312. dmj-NovaJulia2-Step1 {
  5313. //
  5314. // This is the first step in selecting a Nova Julia2
  5315. // fractal.  From here, use the Switch feature again
  5316. // to select the second Julia
  5317. // point.
  5318. //
  5319. int count;
  5320. complex zold;
  5321. complex zold2;
  5322. int p;
  5323. int plength;
  5324. int pmul;
  5325. int pdigit;
  5326. parameter bool switchseeds;
  5327. parameter complex power;
  5328. complex zsquared;
  5329. complex zcubed;
  5330. parameter complex relax;
  5331. parameter complex seed1;
  5332. parameter real bailout;
  5333.  
  5334.     void init(void)
  5335.     {
  5336.         count = 0;
  5337.         zold = (0,0);
  5338.         zold2 = (0,0);
  5339.         z = (1,0);
  5340.  
  5341.         p = 21;//@pattern; Starting pattern
  5342.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  5343.         pmul = floor(10^plength);// multiplier to get leftmost digit
  5344.         pdigit = 0;// used for extracted digit
  5345.  
  5346.     }
  5347.     void loop(void)
  5348.     {
  5349.         pdigit = floor(p / pmul);// rotate pattern one step
  5350.         p = (p-pdigit*pmul)*10 + pdigit;
  5351.         if  ((switchseeds))
  5352.         {// seeds should be swapped
  5353.             pdigit = 3 - pdigit;// use the other seed
  5354.         }
  5355.         if  ((pdigit == 1))
  5356.         {// using first seed
  5357.             if  ((power == (3,0)))
  5358.             {
  5359.                 zsquared = sqr(z);
  5360.                 zcubed = zsquared * z;
  5361.                 z = z - relax * (zcubed-1) / (3*zsquared) + seed1;
  5362.             }
  5363.             else
  5364.             {
  5365.  
  5366.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + seed1;
  5367.             }
  5368.  
  5369.             if  ((|z - zold| < bailout))
  5370.             {
  5371.                 count = count + 1;
  5372.             }
  5373.             else
  5374.             {
  5375.  
  5376.                 count = 0;
  5377.             }
  5378.             zold = z;
  5379.  
  5380.         }
  5381.         else
  5382.         {
  5383. // using second seed
  5384.             if  ((power == (3,0)))
  5385.             {
  5386.                 zsquared = sqr(z);
  5387.                 zcubed = zsquared * z;
  5388.                 z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  5389.             }
  5390.             else
  5391.             {
  5392.  
  5393.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  5394.             }
  5395.  
  5396.             if  ((|z - zold2| < bailout))
  5397.             {
  5398.                 count = count + 1;
  5399.             }
  5400.             else
  5401.             {
  5402.  
  5403.                 count = 0;
  5404.             }
  5405.             zold2 = z;
  5406.     
  5407.         }
  5408.  
  5409.     }
  5410.     bool bailout(void)
  5411.     {
  5412.         return(count < plength);
  5413.  
  5414.     }
  5415.     void description(void)
  5416.     {
  5417.         this.title = "Nova Julia2 Step 1";
  5418.         this.helpfile = "dmj-pub\dmj-pub-uf-nj2.htm";
  5419.         this.maxiter = 1000;
  5420.         this.periodicity = 0;
  5421.         this.center = (-0.5,0);
  5422.         this.magn = 1.5;
  5423.  
  5424.    
  5425.         seed1.caption = "Julia Seed 1";
  5426.         seed1.default = (0,0);
  5427.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  5428.   
  5429.    
  5430.         switchseeds.caption = "Switch Seeds";
  5431.         switchseeds.default = FALSE;
  5432.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  5433.   
  5434. //  param pattern
  5435. //    caption = "Seed Pattern"
  5436. //    default = 21
  5437. //    min = 12
  5438. //    hint = "Defines the pattern in which the two seeds will be used. ;            Each digit indicates the seed to use, 1 or 2; when all ;    digits have been used, the pattern repeats.  The default ;    of 21 gives the original Julia2 behavior."
  5439. //  endparam
  5440.    
  5441.         power.caption = "Exponent";
  5442.         power.default = (3,0);
  5443.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  5444.   
  5445.    
  5446.         bailout.caption = "Bailout";
  5447.         bailout.default = 0.00001;
  5448.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5449.   
  5450.    
  5451.         relax.caption = "Relaxation";
  5452.         relax.default = (1,0);
  5453.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5454.   
  5455.  
  5456.     }
  5457. }
  5458.  
  5459.  
  5460. dmj-NovaJulia2-Step2 {
  5461. //
  5462. // This is the final alternating-c Nova Julia2 fractal.
  5463. // Once both seeds have been selected, you can use
  5464. // the Switch feature again to open up a window
  5465. // which will let you select the first Julia seed
  5466. // again, leaving the second one unchanged.
  5467. //
  5468. int count;
  5469. complex zold;
  5470. complex zold2;
  5471. int p;
  5472. int plength;
  5473. int pmul;
  5474. int pdigit;
  5475. parameter bool switchseeds;
  5476. parameter complex power;
  5477. complex zsquared;
  5478. complex zcubed;
  5479. parameter complex relax;
  5480. parameter complex seed1;
  5481. parameter real bailout;
  5482. parameter complex seed2;
  5483.  
  5484.     void init(void)
  5485.     {
  5486.         count = 0;
  5487.         zold = (0,0);
  5488.         zold2 = (0,0);
  5489.         z = pixel;
  5490.  
  5491.         p = 21;//@pattern; Starting pattern
  5492.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  5493.         pmul = floor(10^plength);// multiplier to get leftmost digit
  5494.         pdigit = 0;// used for extracted digit
  5495.  
  5496.     }
  5497.     void loop(void)
  5498.     {
  5499.         pdigit = floor(p / pmul);// rotate pattern one step
  5500.         p = (p-pdigit*pmul)*10 + pdigit;
  5501.         if  ((switchseeds))
  5502.         {// seeds should be swapped
  5503.             pdigit = 3 - pdigit;// use the other seed
  5504.         }
  5505.         if  ((pdigit == 1))
  5506.         {// using first seed
  5507.             if  ((power == (3,0)))
  5508.             {
  5509.                 zsquared = sqr(z);
  5510.                 zcubed = zsquared * z;
  5511.                 z = z - relax * (zcubed-1) / (3*zsquared) + seed1;
  5512.             }
  5513.             else
  5514.             {
  5515.  
  5516.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + seed1;
  5517.             }
  5518.  
  5519.             if  ((|z - zold| < bailout))
  5520.             {
  5521.                 count = count + 1;
  5522.             }
  5523.             else
  5524.             {
  5525.  
  5526.                 count = 0;
  5527.             }
  5528.             zold = z;
  5529.  
  5530.         }
  5531.         else
  5532.         {
  5533. // using second seed
  5534.             if  ((power == (3,0)))
  5535.             {
  5536.                 zsquared = sqr(z);
  5537.                 zcubed = zsquared * z;
  5538.                 z = z - relax * (zcubed-1) / (3*zsquared) + seed2;
  5539.             }
  5540.             else
  5541.             {
  5542.  
  5543.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + seed2;
  5544.             }
  5545.  
  5546.             if  ((|z - zold2| < bailout))
  5547.             {
  5548.                 count = count + 1;
  5549.             }
  5550.             else if  ((count > 0))
  5551.             {
  5552.                 count = count - 1;
  5553.             }
  5554.             zold2 = z;
  5555.  
  5556.         }
  5557.  
  5558.     }
  5559.     bool bailout(void)
  5560.     {
  5561.         return(count < plength);
  5562.  
  5563.     }
  5564.     void description(void)
  5565.     {
  5566.         this.title = "Nova Julia2 Step 2";
  5567.         this.helpfile = "dmj-pub\dmj-pub-uf-nj2.htm";
  5568.         this.maxiter = 1000;
  5569.         this.periodicity = 0;
  5570.         this.center = (0,0);
  5571.         this.magn = 1.5;
  5572.   
  5573.    
  5574.         seed1.caption = "Julia Seed 1";
  5575.         seed1.default = (0,0);
  5576.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  5577.   
  5578.    
  5579.         seed2.caption = "Julia Seed 2";
  5580.         seed2.default = (0,0);
  5581.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  5582.   
  5583.    
  5584.         switchseeds.caption = "Switch Seeds";
  5585.         switchseeds.default = FALSE;
  5586.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  5587.   
  5588. //  param pattern
  5589. //    caption = "Seed Pattern"
  5590. //    default = 21
  5591. //    min = 12
  5592. //    hint = "Defines the pattern in which the two seeds will be used. ;            Each digit indicates the seed to use, 1 or 2; when all ;    digits have been used, the pattern repeats.  The default ;    of 21 gives the original Julia2 behavior."
  5593. //  endparam
  5594.    
  5595.         power.caption = "Exponent";
  5596.         power.default = (3,0);
  5597.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  5598.   
  5599.    
  5600.         bailout.caption = "Bailout";
  5601.         bailout.default = 0.00001;
  5602.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5603.   
  5604.    
  5605.         relax.caption = "Relaxation";
  5606.         relax.default = (1,0);
  5607.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5608.   
  5609.  
  5610.     }
  5611. }
  5612.  
  5613.  
  5614. dmj-NovaJulia2-Step1a {
  5615. //
  5616. // This is the first step in selecting a Julia2 fractal.  From
  5617. // here, use the Switch feature again to select the second Julia
  5618. // point.
  5619. //
  5620. // Note: an early bug in this formula produced erroneous results.
  5621. // If you have a parameter set which relied on this behavior,
  5622. // please see the obsolete.ufm file.
  5623. //
  5624. int count;
  5625. complex zold;
  5626. complex zold2;
  5627. int p;
  5628. int plength;
  5629. int pmul;
  5630. int pdigit;
  5631. parameter bool switchseeds;
  5632. parameter complex power;
  5633. complex zsquared;
  5634. complex zcubed;
  5635. parameter complex relax;
  5636. parameter real bailout;
  5637. parameter complex seed2;
  5638.  
  5639.     void init(void)
  5640.     {
  5641.         count = 0;
  5642.         zold = (0,0);
  5643.         zold2 = (0,0);
  5644.         z = (1,0);
  5645.  
  5646.         p = 21;//@pattern; Starting pattern
  5647.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  5648.         pmul = floor(10^plength);// multiplier to get leftmost digit
  5649.         pdigit = 0;// used for extracted digit
  5650.  
  5651.     }
  5652.     void loop(void)
  5653.     {
  5654.         pdigit = floor(p / pmul);// rotate pattern one step
  5655.         p = (p-pdigit*pmul)*10 + pdigit;
  5656.         if  ((switchseeds))
  5657.         {// seeds should be swapped
  5658.             pdigit = 3 - pdigit;// use the other seed
  5659.         }
  5660.         if  ((pdigit == 1))
  5661.         {// using first seed
  5662.             if  ((power == (3,0)))
  5663.             {
  5664.                 zsquared = sqr(z);
  5665.                 zcubed = zsquared * z;
  5666.                 z = z - relax * (zcubed-1) / (3*zsquared) + pixel;
  5667.             }
  5668.             else
  5669.             {
  5670.  
  5671.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel;
  5672.             }
  5673.  
  5674.             if  ((|z - zold| < bailout))
  5675.             {
  5676.                 count = count + 1;
  5677.             }
  5678.             else
  5679.             {
  5680.  
  5681.                 count = 0;
  5682.             }
  5683.             zold = z;
  5684.  
  5685.         }
  5686.         else
  5687.         {
  5688. // using second seed
  5689.             if  ((power == (3,0)))
  5690.             {
  5691.                 zsquared = sqr(z);
  5692.                 zcubed = zsquared * z;
  5693.                 z = z - relax * (zcubed-1) / (3*zsquared) + seed2;
  5694.             }
  5695.             else
  5696.             {
  5697.  
  5698.                 z = z - relax * (z^power-1) / (power * z^(power-1)) + seed2;
  5699.             }
  5700.  
  5701.             if  ((|z - zold2| < bailout))
  5702.             {
  5703.                 count = count + 1;
  5704.             }
  5705.             else
  5706.             {
  5707.  
  5708.                 count = 0;
  5709.             }
  5710.             zold2 = z;
  5711.  
  5712.         }
  5713.  
  5714.     }
  5715.     bool bailout(void)
  5716.     {
  5717.         return(count < plength);
  5718.  
  5719.     }
  5720.     void description(void)
  5721.     {
  5722.         this.title = "Nova Julia2 Step 1a";
  5723.         this.helpfile = "dmj-pub\dmj-pub-uf-nj2.htm";
  5724.         this.maxiter = 1000;
  5725.         this.periodicity = 0;
  5726.         this.center = (-0.5,0);
  5727.         this.magn = 1.5;
  5728.  
  5729.    
  5730.         seed2.caption = "Julia Seed 2";
  5731.         seed2.default = (0,0);
  5732.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  5733.   
  5734.    
  5735.         switchseeds.caption = "Switch Seeds";
  5736.         switchseeds.default = FALSE;
  5737.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  5738.   
  5739. //  param pattern
  5740. //    caption = "Seed Pattern"
  5741. //    default = 21
  5742. //    min = 12
  5743. //    hint = "Defines the pattern in which the two seeds will be used. ;            Each digit indicates the seed to use, 1 or 2; when all ;    digits have been used, the pattern repeats.  The default ;    of 21 gives the original Julia2 behavior."
  5744. //  endparam
  5745.    
  5746.         power.caption = "Exponent";
  5747.         power.default = (3,0);
  5748.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  5749.   
  5750.    
  5751.         bailout.caption = "Bailout";
  5752.         bailout.default = 0.00001;
  5753.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  5754.   
  5755.    
  5756.         relax.caption = "Relaxation";
  5757.         relax.default = (1,0);
  5758.         relax.hint = "This can be used to slow down the convergence of the formula.";
  5759.   
  5760.  
  5761.     }
  5762. }
  5763.  
  5764.  
  5765. dmj-PhoenixMandel {
  5766. //
  5767. // This type implements the Phoenix types discovered by
  5768. // Shigehiro Ushiki.  It is somewhat generalized over
  5769. // the FractInt implementation.  The general equation is
  5770. // of the form
  5771. //
  5772. //     z(n+1) = z(n)^a + c*z(n)^b + p*z(n-1)
  5773. //
  5774. // In FractInt, choices for b are restricted to a-1 and
  5775. // a-2.  This implementation allows arbitrary choices
  5776. // for both a and b.
  5777. //
  5778. // If a=2 and b=0 (classic Phoenix) then this type will
  5779. // work with the dmj-Smooth and dmj-Triangle coloring
  5780. // types.
  5781. //
  5782. complex Var_y;
  5783. complex newz;
  5784. parameter complex start;
  5785. parameter complex power1;
  5786. parameter complex power2;
  5787. parameter complex induct;
  5788. parameter real bailout;
  5789.  
  5790.     void init(void)
  5791.     {
  5792.         Var_y = (0,0);
  5793.         newz = (0,0);
  5794.  
  5795.         if  ((start == (0,0)))
  5796.         {// bug in beta 5
  5797.             z = pixel;
  5798.         }
  5799.         else
  5800.         {
  5801.  
  5802.             z = start;
  5803.         }
  5804.   
  5805.     }
  5806.     void loop(void)
  5807.     {
  5808.         newz = z^power1  +  z^power2 * pixel  +  induct * Var_y;
  5809.         Var_y = z;
  5810.         z = newz;
  5811.   
  5812.     }
  5813.     bool bailout(void)
  5814.     {
  5815.         return(|z| < bailout);
  5816.   
  5817.     }
  5818.     void description(void)
  5819.     {
  5820.         this.title = "Phoenix (Mandelbrot)";
  5821.         this.helpfile = "dmj-pub\dmj-pub-uf-phoenix.htm";
  5822.         this.maxiter = 1000;
  5823.         this.center = (-0.5,0);
  5824.   
  5825.    
  5826.         start.caption = "Start Value";
  5827.         start.default = (0,0);
  5828.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  5829.   
  5830.    
  5831.         power1.caption = "Primary Exponent";
  5832.         power1.default = (2,0);
  5833.         power1.hint = "Defines the primary exponent for the fractal.  The classic Phoenix curve uses exponent 2.";
  5834.   
  5835.    
  5836.         power2.caption = "Secondary Exponent";
  5837.         power2.default = (0,0);
  5838.         power2.hint = "Defines the secondary exponent for the fractal.  The classic Phoenix curve uses exponent 0.";
  5839.   
  5840.    
  5841.         induct.caption = "Phoenix Distortion";
  5842.         induct.default = (0.5,0);
  5843.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  5844.   
  5845.    
  5846.         bailout.caption = "Bailout";
  5847.         bailout.default = 1.0e20;
  5848.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Phoenix set anymore.";
  5849.   
  5850.  
  5851.     }
  5852. }
  5853.  
  5854.  
  5855. dmj-PhoenixJulia {
  5856. //
  5857. // This type implements the Phoenix types discovered by
  5858. // Shigehiro Ushiki.  It is somewhat generalized over
  5859. // the FractInt implementation.  The general equation is
  5860. // of the form
  5861. //
  5862. //     z(n+1) = z(n)^a + c*z(n)^b + p*z(n-1)
  5863. //
  5864. // In FractInt, choices for b are restricted to a-1 and
  5865. // a-2.  This implementation allows arbitrary choices
  5866. // for both a and b.
  5867. //
  5868. // If a=2 and b=0 (classic Phoenix) then this type will
  5869. // work with the dmj-Smooth and dmj-Triangle coloring
  5870. // types.
  5871. //
  5872. complex Var_y;
  5873. complex newz;
  5874. parameter complex power1;
  5875. parameter complex power2;
  5876. parameter complex seed;
  5877. parameter complex induct;
  5878. parameter real bailout;
  5879.  
  5880.     void init(void)
  5881.     {
  5882.         Var_y = (0,0);
  5883.         newz = (0,0);
  5884.  
  5885.         z = pixel;
  5886.   
  5887.     }
  5888.     void loop(void)
  5889.     {
  5890.         newz = z^power1  +  z^power2 * seed  +  induct * Var_y;
  5891.         Var_y = z;
  5892.         z = newz;
  5893.   
  5894.     }
  5895.     bool bailout(void)
  5896.     {
  5897.         return(|z| < bailout);
  5898.   
  5899.     }
  5900.     void description(void)
  5901.     {
  5902.         this.title = "Phoenix (Julia)";
  5903.         this.helpfile = "dmj-pub\dmj-pub-uf-phoenix.htm";
  5904.         this.maxiter = 1000;
  5905.         this.center = (0,0);
  5906.   
  5907.    
  5908.         seed.caption = "Julia Seed";
  5909.         seed.default = (0.56667,0);
  5910.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  5911.   
  5912.    
  5913.         power1.caption = "Primary Exponent";
  5914.         power1.default = (2,0);
  5915.         power1.hint = "Defines the primary exponent for the fractal.  The classic Phoenix curve uses exponent 2.";
  5916.   
  5917.    
  5918.         power2.caption = "Secondary Exponent";
  5919.         power2.default = (0,0);
  5920.         power2.hint = "Defines the secondary exponent for the fractal.  The classic Phoenix curve uses exponent 0.";
  5921.   
  5922.    
  5923.         induct.caption = "Phoenix Distortion";
  5924.         induct.default = (-0.5,0);
  5925.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  5926.   
  5927.    
  5928.         bailout.caption = "Bailout";
  5929.         bailout.default = 1.0e20;
  5930.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Phoenix set anymore.";
  5931.   
  5932.  
  5933.     }
  5934. }
  5935.  
  5936.  
  5937. dmj-PhoenixDNovaMandel {
  5938. //
  5939. // This is the DoubleNova fractal (Mandelbrot form),
  5940. // a modified Newtonian-style fractal.
  5941. //
  5942. // This variant includes an inductive component similar
  5943. // to the Phoenix fractal.
  5944. //
  5945. complex zold;
  5946. complex Var_y;
  5947. parameter complex start;
  5948. parameter bool usecritical;
  5949. parameter complex power2;
  5950. parameter complex coeff2;
  5951. parameter complex power1;
  5952. parameter complex coeff1;
  5953. parameter complex relax;
  5954. parameter complex induct;
  5955. parameter real bailout;
  5956.  
  5957.     void init(void)
  5958.     {
  5959.         zold = (0,0);
  5960.         Var_y = (0,0);
  5961.   
  5962.         z = start;
  5963.         if  ((usecritical))
  5964.         {
  5965.             z = ( -((power2-1)*power2*coeff2) / ((power1-1)*power1*coeff1) ) ^ (1/(power1-power2));
  5966.         }
  5967.   
  5968.     }
  5969.     void loop(void)
  5970.     {
  5971.         Var_y = zold;
  5972.         zold = z;
  5973.         z = z - (coeff1*z^power1 + coeff2*z^power2 - 1) * relax / (coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1)) + pixel + induct*Var_y;
  5974.   
  5975.     }
  5976.     bool bailout(void)
  5977.     {
  5978.         return(|z - zold| > bailout);
  5979.   
  5980.     }
  5981.     void description(void)
  5982.     {
  5983.         this.title = "PhoenixDoubleNova (Mandelbrot)";
  5984.         this.helpfile = "dmj-pub\dmj-pub-uf-pdn.htm";
  5985.         this.maxiter = 1000;
  5986.         this.periodicity = 0;
  5987.         this.center = (-0.5,0);
  5988.         this.magn = 1.5;
  5989.   
  5990.    
  5991.         start.caption = "Start Value";
  5992.         start.default = (1,0);
  5993.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  5994.   
  5995.    
  5996.         power1.caption = "Primary Exponent";
  5997.         power1.default = (4,0);
  5998.         power1.hint = "Defines the primary exponent for the equation.";
  5999.   
  6000.    
  6001.         power2.caption = "Secondary Exponent";
  6002.         power2.default = (2,0);
  6003.         power2.hint = "Defines the secondary exponent for the equation.";
  6004.   
  6005.    
  6006.         coeff1.caption = "Primary Scale";
  6007.         coeff1.default = (1,0);
  6008.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  6009.   
  6010.    
  6011.         coeff2.caption = "Secondary Scale";
  6012.         coeff2.default = (-3,0);
  6013.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  6014.   
  6015.    
  6016.         induct.caption = "Phoenix Distortion";
  6017.         induct.default = (-0.5,0);
  6018.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6019.   
  6020.    
  6021.         bailout.caption = "Bailout";
  6022.         bailout.default = 0.00001;
  6023.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6024.   
  6025.    
  6026.         usecritical.caption = "Use Critical Point";
  6027.         usecritical.default = false;
  6028.         usecritical.hint = "If set, a critical point for the function will be used in place of the Start Value.";
  6029.   
  6030.    
  6031.         relax.caption = "Relaxation";
  6032.         relax.default = (1,0);
  6033.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6034.   
  6035.  
  6036.     }
  6037. }
  6038.  
  6039.  
  6040. dmj-PhoenixDNovaJulia {
  6041. //
  6042. // This is the DoubleNova fractal (Julia form), a
  6043. // modified Newtonian-style fractal.
  6044. //
  6045. // This variant includes an inductive component similar
  6046. // to the Phoenix fractal.
  6047. //
  6048. complex zold;
  6049. complex Var_y;
  6050. parameter complex coeff1;
  6051. parameter complex power1;
  6052. parameter complex coeff2;
  6053. parameter complex power2;
  6054. parameter complex relax;
  6055. parameter complex seed;
  6056. parameter complex induct;
  6057. parameter real bailout;
  6058.  
  6059.     void init(void)
  6060.     {
  6061.         zold = (0,0);
  6062.         Var_y = (0,0);
  6063.   
  6064.         z = pixel;
  6065.   
  6066.     }
  6067.     void loop(void)
  6068.     {
  6069.         Var_y = zold;
  6070.         zold = z;
  6071.         z = z - (coeff1*z^power1 + coeff2*z^power2 - 1) * relax / (coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1)) + seed + induct*Var_y;
  6072.   
  6073.     }
  6074.     bool bailout(void)
  6075.     {
  6076.         return(|z - zold| > bailout);
  6077.   
  6078.     }
  6079.     void description(void)
  6080.     {
  6081.         this.title = "PhoenixDoubleNova (Julia)";
  6082.         this.helpfile = "dmj-pub\dmj-pub-uf-pdn.htm";
  6083.         this.maxiter = 1000;
  6084.         this.periodicity = 0;
  6085.         this.center = (0,0);
  6086.         this.magn = 1.5;
  6087.   
  6088.    
  6089.         seed.caption = "Julia Seed";
  6090.         seed.default = (0,0);
  6091.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  6092.   
  6093.    
  6094.         power1.caption = "Primary Exponent";
  6095.         power1.default = (4,0);
  6096.         power1.hint = "Defines the primary exponent for the equation.";
  6097.   
  6098.    
  6099.         power2.caption = "Secondary Exponent";
  6100.         power2.default = (2,0);
  6101.         power2.hint = "Defines the secondary exponent for the equation.";
  6102.   
  6103.    
  6104.         coeff1.caption = "Primary Scale";
  6105.         coeff1.default = (1,0);
  6106.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  6107.   
  6108.    
  6109.         coeff2.caption = "Secondary Scale";
  6110.         coeff2.default = (-2,0);
  6111.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  6112.   
  6113.    
  6114.         induct.caption = "Phoenix Distortion";
  6115.         induct.default = (-0.5,0);
  6116.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6117.   
  6118.    
  6119.         bailout.caption = "Bailout";
  6120.         bailout.default = 0.00001;
  6121.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6122.   
  6123.    
  6124.         relax.caption = "Relaxation";
  6125.         relax.default = (1,0);
  6126.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6127.   
  6128.  
  6129.     }
  6130. }
  6131.  
  6132.  
  6133. dmj-PhoenixDHNovaMandel {
  6134. //
  6135. // This is the DoubleHalleyNova fractal (Mandelbrot form),
  6136. // a modified Newtonian-style fractal.
  6137. //
  6138. // This variant includes an inductive component similar
  6139. // to the Phoenix fractal.
  6140. //
  6141. complex Var_y;
  6142. complex zold;
  6143. complex fz;
  6144. complex f1z;
  6145. complex f2z;
  6146. parameter complex start;
  6147. parameter complex coeff1;
  6148. parameter complex power1;
  6149. parameter complex coeff2;
  6150. parameter complex power2;
  6151. parameter complex relax;
  6152. parameter complex induct;
  6153. parameter real bailout;
  6154.  
  6155.     void init(void)
  6156.     {
  6157.         Var_y = (0,0);
  6158.         zold = (0,0);
  6159.         fz = (0,0);
  6160.         f1z = (0,0);
  6161.         f2z = (0,0);
  6162.   
  6163.         z = start;
  6164. //  IF (@usecritical)
  6165. //  ENDIF
  6166.   
  6167.     }
  6168.     void loop(void)
  6169.     {
  6170.         Var_y = zold;
  6171.         zold = z;
  6172.         fz  = coeff1*z^power1 + coeff2*z^power2 - 1;
  6173.         f1z = coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1);
  6174.         f2z = coeff1*power1*(power1-1)*z^(power1-2) + coeff2*power2*(power2-1)*z^(power2-2);
  6175.         z = z - relax * (2*fz*f1z) / (2*f1z^2 - fz*f2z) + pixel + induct*Var_y;
  6176.   
  6177.     }
  6178.     bool bailout(void)
  6179.     {
  6180.         return(|z - zold| > bailout);
  6181.   
  6182.     }
  6183.     void description(void)
  6184.     {
  6185.         this.title = "PhoenixDoubleHalleyNova (Mandelbrot)";
  6186.         this.helpfile = "dmj-pub\dmj-pub-uf-pdhn.htm";
  6187.         this.maxiter = 1000;
  6188.         this.periodicity = 0;
  6189.         this.center = (-0.5,0);
  6190.         this.magn = 1.5;
  6191.   
  6192.    
  6193.         start.caption = "Start Value";
  6194.         start.default = (1,0);
  6195.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  6196.   
  6197.    
  6198.         power1.caption = "Primary Exponent";
  6199.         power1.default = (4,0);
  6200.         power1.hint = "Defines the primary exponent for the equation.";
  6201.   
  6202.    
  6203.         power2.caption = "Secondary Exponent";
  6204.         power2.default = (2,0);
  6205.         power2.hint = "Defines the secondary exponent for the equation.";
  6206.   
  6207.    
  6208.         coeff1.caption = "Primary Scale";
  6209.         coeff1.default = (1,0);
  6210.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  6211.   
  6212.    
  6213.         coeff2.caption = "Secondary Scale";
  6214.         coeff2.default = (-3,0);
  6215.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  6216.   
  6217.    
  6218.         induct.caption = "Phoenix Distortion";
  6219.         induct.default = (-0.5,0);
  6220.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6221.   
  6222.    
  6223.         bailout.caption = "Bailout";
  6224.         bailout.default = 0.00001;
  6225.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6226.   
  6227. //  param usecritical
  6228. //    caption = "Use Critical Point"
  6229. //    default = false
  6230. //    hint = "If set, a critical point for the function will ;            be used in place of the Start Value."
  6231. //  endparam
  6232.    
  6233.         relax.caption = "Relaxation";
  6234.         relax.default = (1,0);
  6235.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6236.   
  6237.  
  6238.     }
  6239. }
  6240.  
  6241.  
  6242. dmj-PhoenixDHNovaJulia {
  6243. //
  6244. // This is the DoubleHalleyNova fractal (Julia form), a
  6245. // modified Newtonian-style fractal.
  6246. //
  6247. // This variant includes an inductive component similar
  6248. // to the Phoenix fractal.
  6249. //
  6250. complex Var_y;
  6251. complex zold;
  6252. complex fz;
  6253. complex f1z;
  6254. complex f2z;
  6255. parameter complex coeff1;
  6256. parameter complex power1;
  6257. parameter complex coeff2;
  6258. parameter complex power2;
  6259. parameter complex relax;
  6260. parameter complex seed;
  6261. parameter complex induct;
  6262. parameter real bailout;
  6263.  
  6264.     void init(void)
  6265.     {
  6266.         Var_y = (0,0);
  6267.         zold = (0,0);
  6268.         fz = (0,0);
  6269.         f1z = (0,0);
  6270.         f2z = (0,0);
  6271.   
  6272.         z = pixel;
  6273.   
  6274.     }
  6275.     void loop(void)
  6276.     {
  6277.         Var_y = zold;
  6278.         zold = z;
  6279.         fz  = coeff1*z^power1 + coeff2*z^power2 - 1;
  6280.         f1z = coeff1*power1*z^(power1-1) + coeff2*power2*z^(power2-1);
  6281.         f2z = coeff1*power1*(power1-1)*z^(power1-2) + coeff2*power2*(power2-1)*z^(power2-2);
  6282.         z = z - relax * (2*fz*f1z) / (2*f1z^2 - fz*f2z) + seed + induct*Var_y;
  6283.   
  6284.     }
  6285.     bool bailout(void)
  6286.     {
  6287.         return(|z - zold| > bailout);
  6288.   
  6289.     }
  6290.     void description(void)
  6291.     {
  6292.         this.title = "PhoenixDoubleHalleyNova (Julia)";
  6293.         this.helpfile = "dmj-pub\dmj-pub-uf-pdhn.htm";
  6294.         this.maxiter = 1000;
  6295.         this.periodicity = 0;
  6296.         this.center = (0,0);
  6297.         this.magn = 1.5;
  6298.   
  6299.    
  6300.         seed.caption = "Julia Seed";
  6301.         seed.default = (0,0);
  6302.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  6303.   
  6304.    
  6305.         power1.caption = "Primary Exponent";
  6306.         power1.default = (4,0);
  6307.         power1.hint = "Defines the primary exponent for the equation.";
  6308.   
  6309.    
  6310.         power2.caption = "Secondary Exponent";
  6311.         power2.default = (2,0);
  6312.         power2.hint = "Defines the secondary exponent for the equation.";
  6313.   
  6314.    
  6315.         coeff1.caption = "Primary Scale";
  6316.         coeff1.default = (1,0);
  6317.         coeff1.hint = "Defines the coefficient (multiplier) for the primary exponent term.";
  6318.   
  6319.    
  6320.         coeff2.caption = "Secondary Scale";
  6321.         coeff2.default = (-2,0);
  6322.         coeff2.hint = "Defines the coefficient (multiplier) for the secondary exponent term.";
  6323.   
  6324.    
  6325.         induct.caption = "Phoenix Distortion";
  6326.         induct.default = (-0.5,0);
  6327.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6328.   
  6329.    
  6330.         bailout.caption = "Bailout";
  6331.         bailout.default = 0.00001;
  6332.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6333.   
  6334.    
  6335.         relax.caption = "Relaxation";
  6336.         relax.default = (1,0);
  6337.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6338.   
  6339.  
  6340.     }
  6341. }
  6342.  
  6343.  
  6344. dmj-PhoenixNovaMandel {
  6345. //
  6346. // This is the PhoenixNova fractal, a Phoenix variant
  6347. // of the Nova fractal. This is the Mandelbrot flavor.
  6348. //
  6349. complex zsquared;
  6350. complex zcubed;
  6351. complex zold;
  6352. complex Var_y;
  6353. parameter complex start;
  6354. parameter complex power;
  6355. parameter complex relax;
  6356. parameter complex induct;
  6357. parameter real bailout;
  6358.  
  6359.     void init(void)
  6360.     {
  6361.         zsquared = (0,0);
  6362.         zcubed = (0,0);
  6363.         zold = (0,0);
  6364.  
  6365.         Var_y = (0,0);
  6366.         z = start;
  6367.   
  6368.     }
  6369.     void loop(void)
  6370.     {
  6371.         if  ((power == (3,0)))
  6372.         {// special optimized routine for power 3
  6373.             zsquared = sqr(z);
  6374.             zcubed = zsquared * z;
  6375.             Var_y = zold;
  6376.             zold = z;
  6377.             z = z - relax * (zcubed-1) / (3*zsquared) + pixel + induct*Var_y;
  6378.         }
  6379.         else
  6380.         {
  6381.  
  6382.             Var_y = zold;
  6383.             zold = z;
  6384.             z = z - relax * (z^power-1) / (power * z^(power-1)) + pixel + induct*Var_y;
  6385.         }
  6386.   
  6387.     }
  6388.     bool bailout(void)
  6389.     {
  6390.         return(|z - zold| > bailout);
  6391.   
  6392.     }
  6393.     void description(void)
  6394.     {
  6395.         this.title = "PhoenixNova (Mandelbrot)";
  6396.         this.helpfile = "dmj-pub\dmj-pub-uf-pn.htm";
  6397.         this.maxiter = 1000;
  6398.         this.periodicity = 0;
  6399.         this.center = (-0.5,0);
  6400.         this.magn = 1.5;
  6401.   
  6402.    
  6403.         start.caption = "Start Value";
  6404.         start.default = (1,0);
  6405.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  6406.   
  6407.    
  6408.         power.caption = "Exponent";
  6409.         power.default = (3,0);
  6410.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  6411.   
  6412.    
  6413.         induct.caption = "Phoenix Distortion";
  6414.         induct.default = (-0.5,0);
  6415.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6416.   
  6417.    
  6418.         bailout.caption = "Bailout";
  6419.         bailout.default = 0.00001;
  6420.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6421.   
  6422.    
  6423.         relax.caption = "Relaxation";
  6424.         relax.default = (1,0);
  6425.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6426.   
  6427.  
  6428.     }
  6429. }
  6430.  
  6431.  
  6432. dmj-PhoenixNovaJulia {
  6433. //
  6434. // This is the PhoenixNova fractal, a Phoenix variant
  6435. // of the Nova fractal. This is the Julia flavor.
  6436. //
  6437. complex zsquared;
  6438. complex zcubed;
  6439. complex zold;
  6440. complex Var_y;
  6441. parameter complex power;
  6442. parameter complex relax;
  6443. parameter complex seed;
  6444. parameter complex induct;
  6445. parameter real bailout;
  6446.  
  6447.     void init(void)
  6448.     {
  6449.         zsquared = (0,0);
  6450.         zcubed = (0,0);
  6451.         zold = (0,0);
  6452.  
  6453.         Var_y = (0,0);
  6454.         z = pixel;
  6455.   
  6456.     }
  6457.     void loop(void)
  6458.     {
  6459.         if  ((power == (3,0)))
  6460.         {// special optimized routine for power 3
  6461.             zsquared = sqr(z);
  6462.             zcubed = zsquared * z;
  6463.             Var_y = zold;
  6464.             zold = z;
  6465.             z = z - relax * (zcubed-1) / (3*zsquared) + seed + induct*Var_y;
  6466.         }
  6467.         else
  6468.         {
  6469.  
  6470.             Var_y = zold;
  6471.             zold = z;
  6472.             z = z - relax * (z^power-1) / (power * z^(power-1)) + seed + induct*Var_y;
  6473.         }
  6474.   
  6475.     }
  6476.     bool bailout(void)
  6477.     {
  6478.         return(|z - zold| > bailout);
  6479.   
  6480.     }
  6481.     void description(void)
  6482.     {
  6483.         this.title = "PhoenixNova (Julia)";
  6484.         this.helpfile = "dmj-pub\dmj-pub-uf-pn.htm";
  6485.         this.maxiter = 1000;
  6486.         this.periodicity = 0;
  6487.         this.center = (0,0);
  6488.         this.magn = 1.5;
  6489.   
  6490.    
  6491.         seed.caption = "Julia Seed";
  6492.         seed.default = (0,0);
  6493.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  6494.   
  6495.    
  6496.         power.caption = "Exponent";
  6497.         power.default = (3,0);
  6498.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  6499.   
  6500.    
  6501.         induct.caption = "Phoenix Distortion";
  6502.         induct.default = (-0.5,0);
  6503.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6504.   
  6505.    
  6506.         bailout.caption = "Bailout";
  6507.         bailout.default = 0.00001;
  6508.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6509.   
  6510.    
  6511.         relax.caption = "Relaxation";
  6512.         relax.default = (1,0);
  6513.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6514.   
  6515.  
  6516.     }
  6517. }
  6518.  
  6519.  
  6520. dmj-PhoenixHNovaMandel {
  6521. //
  6522. // This is the PhoenixHalleyNova fractal (Mandelbrot
  6523. // form), a Phoenix variant of the HalleyNova fractal.
  6524. //
  6525. complex nsquaredplusn;
  6526. parameter complex power;
  6527. complex nsquaredminusn;
  6528. complex zton;
  6529. complex zold;
  6530. complex Var_y;
  6531. parameter complex start;
  6532. parameter complex relax;
  6533. parameter complex induct;
  6534. parameter real bailout;
  6535.  
  6536.     void init(void)
  6537.     {
  6538.         nsquaredplusn = sqr(power) + power;
  6539.         nsquaredminusn = sqr(power) - power;
  6540.         zton = (0,0);
  6541.         zold = (0,0);
  6542.  
  6543.         Var_y = (0,0);
  6544.         z = start;
  6545.   
  6546.     }
  6547.     void loop(void)
  6548.     {
  6549.         Var_y = zold;
  6550.         zold = z;
  6551.         zton = z^power;
  6552.         z = z - (2*power*z * (zton-1)) * relax / (nsquaredplusn*zton + nsquaredminusn) + pixel + induct*Var_y;
  6553.  
  6554.     }
  6555.     bool bailout(void)
  6556.     {
  6557.         return(|z - zold| > bailout);
  6558.   
  6559.     }
  6560.     void description(void)
  6561.     {
  6562.         this.title = "PhoenixHalleyNova (Mandelbrot)";
  6563.         this.helpfile = "dmj-pub\dmj-pub-uf-phn.htm";
  6564.         this.maxiter = 1000;
  6565.         this.periodicity = 0;
  6566.         this.center = (-0.5,0);
  6567.         this.magn = 1.0;
  6568.   
  6569.    
  6570.         start.caption = "Start Value";
  6571.         start.default = (1,0);
  6572.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  6573.   
  6574.    
  6575.         power.caption = "Exponent";
  6576.         power.default = (3,0);
  6577.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic HalleyNovaM type.";
  6578.   
  6579.    
  6580.         induct.caption = "Phoenix Distortion";
  6581.         induct.default = (-0.5,0);
  6582.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6583.   
  6584.    
  6585.         bailout.caption = "Bailout";
  6586.         bailout.default = 0.00001;
  6587.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6588.   
  6589.    
  6590.         relax.caption = "Relaxation";
  6591.         relax.default = (1,0);
  6592.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6593.   
  6594.  
  6595.     }
  6596. }
  6597.  
  6598.  
  6599. dmj-PhoenixHNovaJulia {
  6600. //
  6601. // This is the PhoenixHalleyNova fractal (Julia form),
  6602. // a Phoenix variant of the HalleyNova fractal.
  6603. //
  6604. complex nsquaredplusn;
  6605. parameter complex power;
  6606. complex nsquaredminusn;
  6607. complex zton;
  6608. complex zold;
  6609. complex Var_y;
  6610. parameter complex relax;
  6611. parameter complex seed;
  6612. parameter complex induct;
  6613. parameter real bailout;
  6614.  
  6615.     void init(void)
  6616.     {
  6617.         nsquaredplusn = sqr(power) + power;
  6618.         nsquaredminusn = sqr(power) - power;
  6619.         zton = (0,0);
  6620.         zold = (0,0);
  6621.   
  6622.         Var_y = (0,0);
  6623.         z = pixel;
  6624.   
  6625.     }
  6626.     void loop(void)
  6627.     {
  6628.         Var_y = zold;
  6629.         zold = z;
  6630.         zton = z^power;
  6631.         z = z - (2*power*z * (zton-1)) * relax /(nsquaredplusn*zton + nsquaredminusn) + seed + induct*Var_y;
  6632.   
  6633.     }
  6634.     bool bailout(void)
  6635.     {
  6636.         return(|z - zold| > bailout);
  6637.   
  6638.     }
  6639.     void description(void)
  6640.     {
  6641.         this.title = "PhoenixHalleyNova (Julia)";
  6642.         this.helpfile = "dmj-pub\dmj-pub-uf-phn.htm";
  6643.         this.maxiter = 1000;
  6644.         this.periodicity = 0;
  6645.         this.center = (0,0);
  6646.         this.magn = 0.5;
  6647.   
  6648.    
  6649.         seed.caption = "Julia Seed";
  6650.         seed.default = (0,0);
  6651.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  6652.   
  6653.    
  6654.         power.caption = "Exponent";
  6655.         power.default = (3,0);
  6656.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic HalleyNovaJ type.";
  6657.   
  6658.    
  6659.         induct.caption = "Phoenix Distortion";
  6660.         induct.default = (-0.5,0);
  6661.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6662.   
  6663.    
  6664.         bailout.caption = "Bailout";
  6665.         bailout.default = 0.00001;
  6666.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  6667.   
  6668.    
  6669.         relax.caption = "Relaxation";
  6670.         relax.default = (1,0);
  6671.         relax.hint = "This can be used to slow down the convergence of the formula.";
  6672.   
  6673.  
  6674.     }
  6675. }
  6676.  
  6677.  
  6678. dmj-SimurghMandel {
  6679. //
  6680. // This is the Simurgh fractal, a slight extrapolation
  6681. // of the techniques used to produce the Phoenix fractal.
  6682. // Its formula is:
  6683. //
  6684. //     z(n+1) = z(n)^a + c*z(n)^b + p*z(n-1) + q*z(n-2)
  6685. //
  6686. // If a=2 and b=0 then this type will work with the
  6687. // dmj-Smooth and dmj-Triangle coloring types.
  6688. //
  6689. complex w;
  6690. complex Var_y;
  6691. complex newz;
  6692. parameter complex start;
  6693. parameter complex power1;
  6694. parameter complex power2;
  6695. parameter complex induct;
  6696. parameter complex induct2;
  6697. parameter real bailout;
  6698.  
  6699.     void init(void)
  6700.     {
  6701.         w = (0,0);
  6702.         Var_y = (0,0);
  6703.         newz = (0,0);
  6704.  
  6705.         if  ((start == (0,0)))
  6706.         {// bug in beta 5
  6707.             z = pixel;
  6708.         }
  6709.         else
  6710.         {
  6711.  
  6712.             z = start;
  6713.         }
  6714.   
  6715.     }
  6716.     void loop(void)
  6717.     {
  6718.         newz = z^power1  +  z^power2 * pixel  +  induct * Var_y + induct2 * w;
  6719.         w = Var_y;
  6720.         Var_y = z;
  6721.         z = newz;
  6722.   
  6723.     }
  6724.     bool bailout(void)
  6725.     {
  6726.         return(|z| < bailout);
  6727.   
  6728.     }
  6729.     void description(void)
  6730.     {
  6731.         this.title = "Simurgh (Mandelbrot)";
  6732.         this.helpfile = "dmj-pub\dmj-pub-uf-simurgh.htm";
  6733.         this.maxiter = 1000;
  6734.         this.center = (-0.5,0);
  6735.   
  6736.    
  6737.         start.caption = "Start Value";
  6738.         start.default = (0,0);
  6739.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  6740.   
  6741.    
  6742.         power1.caption = "Primary Exponent";
  6743.         power1.default = (2,0);
  6744.         power1.hint = "Defines the primary exponent for the fractal.";
  6745.   
  6746.    
  6747.         power2.caption = "Secondary Exponent";
  6748.         power2.default = (0,0);
  6749.         power2.hint = "Defines the secondary exponent for the fractal.";
  6750.   
  6751.    
  6752.         induct.caption = "Simurgh Distortion 1";
  6753.         induct.default = (0.5,0);
  6754.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6755.   
  6756.    
  6757.         induct2.caption = "Simurgh Distortion 2";
  6758.         induct2.default = (-0.25,0);
  6759.         induct2.hint = "Sets how 'strong' the next previous iteration's effect should be on the fractal.";
  6760.   
  6761.    
  6762.         bailout.caption = "Bailout";
  6763.         bailout.default = 1.0e20;
  6764.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Simurgh set anymore.";
  6765.   
  6766.  
  6767.     }
  6768. }
  6769.  
  6770.  
  6771. dmj-SimurghJulia {
  6772. //
  6773. // This is the Simurgh fractal, a slight extrapolation
  6774. // of the techniques used to produce the Phoenix fractal.
  6775. // Its formula is:
  6776. //
  6777. //     z(n+1) = z(n)^a + c*z(n)^b + p*z(n-1) + q*z(n-2)
  6778. //
  6779. // If a=2 and b=0 then this type will work with the
  6780. // dmj-Smooth and dmj-Triangle coloring types.
  6781. //
  6782. complex w;
  6783. complex Var_y;
  6784. complex newz;
  6785. parameter complex power1;
  6786. parameter complex power2;
  6787. parameter complex seed;
  6788. parameter complex induct;
  6789. parameter complex induct2;
  6790. parameter real bailout;
  6791.  
  6792.     void init(void)
  6793.     {
  6794.         w = (0,0);
  6795.         Var_y = (0,0);
  6796.         newz = (0,0);
  6797.  
  6798.         z = pixel;
  6799.   
  6800.     }
  6801.     void loop(void)
  6802.     {
  6803.         newz = z^power1  +  z^power2 * seed  +  induct * Var_y + induct2 * w;
  6804.         w = Var_y;
  6805.         Var_y = z;
  6806.         z = newz;
  6807.   
  6808.     }
  6809.     bool bailout(void)
  6810.     {
  6811.         return(|z| < bailout);
  6812.   
  6813.     }
  6814.     void description(void)
  6815.     {
  6816.         this.title = "Simurgh (Julia)";
  6817.         this.helpfile = "dmj-pub\dmj-pub-uf-simurgh.htm";
  6818.         this.maxiter = 1000;
  6819.         this.center = (0,0);
  6820.   
  6821.    
  6822.         seed.caption = "Julia Seed";
  6823.         seed.default = (0.03125,0.5625);
  6824.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  6825.   
  6826.    
  6827.         power1.caption = "Primary Exponent";
  6828.         power1.default = (2,0);
  6829.         power1.hint = "Defines the primary exponent for the fractal.";
  6830.   
  6831.    
  6832.         power2.caption = "Secondary Exponent";
  6833.         power2.default = (0,0);
  6834.         power2.hint = "Defines the secondary exponent for the fractal.";
  6835.   
  6836.    
  6837.         induct.caption = "Simurgh Distortion 1";
  6838.         induct.default = (0,0);
  6839.         induct.hint = "Sets how 'strong' the previous iteration's effect should be on the fractal.";
  6840.   
  6841.    
  6842.         induct2.caption = "Simurgh Distortion 2";
  6843.         induct2.default = (-0.5,0);
  6844.         induct2.hint = "Sets how 'strong' the next previous iteration's effect should be on the fractal.";
  6845.   
  6846.    
  6847.         bailout.caption = "Bailout";
  6848.         bailout.default = 1.0e20;
  6849.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Simurgh set anymore.";
  6850.   
  6851.  
  6852.     }
  6853. }
  6854.  
  6855.  
  6856. dmj-SlopeLyapMandel {
  6857. //
  6858. // This is the LambdaMandelbrot set, but the calculations
  6859. // are modified so that z contains a surface normal
  6860. // to the set instead of the orbit value.  This is
  6861. // intended primarily for the Lighting coloring
  6862. // method, but might have interesting results for
  6863. // other methods, too.
  6864. //
  6865. complex c1;
  6866. complex c2;
  6867. parameter real offset;
  6868. complex c3;
  6869. complex z1;
  6870. parameter complex start;
  6871. complex z2;
  6872. complex z3;
  6873. int done;
  6874. real modz;
  6875. real il2;
  6876. parameter complex power;
  6877. real lp;
  6878. parameter real bailout;
  6879. real e1;
  6880. real e2;
  6881. real e3;
  6882. real vx;
  6883. real vy;
  6884. real vz;
  6885. real vd;
  6886. real d1;
  6887. real d2;
  6888. real d3;
  6889. real s1;
  6890. complex e20;
  6891. real s2;
  6892. real s3;
  6893. complex g1;
  6894. complex g2;
  6895. complex g3;
  6896. complex o1;
  6897. complex o2;
  6898. complex o3;
  6899. parameter int zmode;
  6900. parameter bool everyiter;
  6901. parameter real zscale;
  6902. parameter int xfer;
  6903. parameter real zscale2;
  6904.  
  6905.     void init(void)
  6906.     {
  6907.         c1 = pixel;// primary iterated point
  6908.         c2 = pixel + offset;// horizontally offset point
  6909.         c3 = pixel + flip(offset);// vertically offset point
  6910.         z1 = start;// starting value
  6911.         z2 = start;
  6912.         z3 = start;
  6913. //  complex z1 = @start      ; starting value
  6914. //  complex z2 = @start + @offset
  6915. //  complex z3 = @start + flip(@offset)
  6916.         done = 2;
  6917.         modz = 0.0;
  6918.         il2 = 1/log(real(power));// Inverse log 2 (precalc).
  6919.         lp = log(log(bailout));// log(log bailout) (precalc).
  6920.         e1 = 0.0;// potentials
  6921.         e2 = 0.0;
  6922.         e3 = 0.0;
  6923.         vx = 0.0;// normal vector
  6924.         vy = 0.0;
  6925.         vz = 0.0;
  6926.         vd = 0.0;
  6927.         d1 = 0.0;// distances
  6928.         d2 = 0.0;
  6929.         d3 = 0.0;
  6930.         s1 = 1.0e20;// smallest distances
  6931.         s2 = 1.0e20;
  6932.         s3 = 1.0e20;
  6933. //  float a1 = 0.0      ; averages
  6934. //  float a2 = 0.0
  6935. //  float a3 = 0.0
  6936. //  float oa1 = 0.0
  6937. //  float oa2 = 0.0
  6938. //  float oa3 = 0.0
  6939.         g1 = (0,0);// distance estimates
  6940.         g2 = (0,0);
  6941.         g3 = (0,0);
  6942.         o1 = (0,0);
  6943.         o2 = (0,0);
  6944.         o3 = (0,0);
  6945. //  IF (@zmode == 7)      ; triangle inequality
  6946. //    s1 = cabs(c1)      ; precalc
  6947. //    s2 = cabs(c2)
  6948. //    s3 = cabs(c3)
  6949. //  ENDIF
  6950.   
  6951.     }
  6952.     void loop(void)
  6953.     {
  6954. //  z = #pixel*z*(1-z)^(@power-1)
  6955.         z1 = c1*z1*(1-z1)^(power-1);// iterate each point
  6956.         z2 = c2*z2*(1-z2)^(power-1);// iterate each point
  6957.         z3 = c3*z3*(1-z3)^(power-1);// iterate each point
  6958. //  z1 = z1^@power + c2
  6959. //  z2 = z2^@power + c2
  6960. //  z3 = z3^@power + c3
  6961.         done = done + 1;// increment iteration counter
  6962.  
  6963.         if  ((zmode == 1))
  6964.         {// smallest |z|
  6965.             d1 = |z1|;// get current distances from origin
  6966.             d2 = |z2|;
  6967.             d3 = |z3|;
  6968.             if  ((d1 < s1))
  6969.             {// update smallest distances
  6970.                 s1 = d1;
  6971.             }
  6972.             if  ((d2 < s2))
  6973.             {
  6974.                 s2 = d2;
  6975.             }
  6976.             if  ((d3 < s3))
  6977.             {
  6978.                 s3 = d3;
  6979.             }
  6980.         }
  6981.         else if  ((zmode == 2))
  6982.         {// smallest |real(z)|
  6983.             d1 = abs(real(z1));// get current distances from i axis
  6984.             d2 = abs(real(z2));
  6985.             d3 = abs(real(z3));
  6986.             if  ((d1 < s1))
  6987.             {// update smallest distances
  6988.                 s1 = d1;
  6989.             }
  6990.             if  ((d2 < s2))
  6991.             {
  6992.                 s2 = d2;
  6993.             }
  6994.             if  ((d3 < s3))
  6995.             {
  6996.                 s3 = d3;
  6997.             }
  6998.         }
  6999.         else if  ((zmode == 3))
  7000.         {// smallest |imag(z)|
  7001.             d1 = abs(imag(z1));// get current distances from r axis
  7002.             d2 = abs(imag(z2));
  7003.             d3 = abs(imag(z3));
  7004.             if  ((d1 < s1))
  7005.             {// update smallest distances
  7006.                 s1 = d1;
  7007.             }
  7008.             if  ((d2 < s2))
  7009.             {
  7010.                 s2 = d2;
  7011.             }
  7012.             if  ((d3 < s3))
  7013.             {
  7014.                 s3 = d3;
  7015.             }
  7016.         }
  7017.         else if  ((zmode == 4))
  7018.         {// smallest |real(z)|+|imag(z)|
  7019.             d1 = abs(real(z1))+abs(imag(z1));// get current distances from i axis
  7020.             d2 = abs(real(z2))+abs(imag(z2));
  7021.             d3 = abs(real(z3))+abs(imag(z3));
  7022.             if  ((d1 < s1))
  7023.             {// update smallest distances
  7024.                 s1 = d1;
  7025.             }
  7026.             if  ((d2 < s2))
  7027.             {
  7028.                 s2 = d2;
  7029.             }
  7030.             if  ((d3 < s3))
  7031.             {
  7032.                 s3 = d3;
  7033.             }
  7034.         }
  7035.         else if  ((zmode == 5))
  7036.         {// smallest |atan(z)|
  7037.             d1 = abs(atan2(z1));// get current angles
  7038.             d2 = abs(atan2(z2));
  7039.             d3 = abs(atan2(z3));
  7040.             if  ((d1 < s1))
  7041.             {// update smallest distances
  7042.                 s1 = d1;
  7043.             }
  7044.             if  ((d2 < s2))
  7045.             {
  7046.                 s2 = d2;
  7047.             }
  7048.             if  ((d3 < s3))
  7049.             {
  7050.                 s3 = d3;
  7051.             }
  7052.         }
  7053.         else if  ((zmode == 6))
  7054.         {// distance estimator
  7055.             o1 = g1;
  7056.             o2 = g2;
  7057.             o3 = g3;
  7058.             g1 = power * z1^(power-1) * g1 + 1;// update distance estimates
  7059.             g2 = power * z2^(power-1) * g2 + 1;
  7060.             g3 = power * z3^(power-1) * g3 + 1;
  7061. //  ELSEIF (@zmode == 7 && done > 3)  ; triangle inequality
  7062. //    oa1 = a1
  7063. //    oa2 = a2
  7064. //    oa3 = a3
  7065. //    d1 = cabs(z1 - c1)      ; |z|
  7066. //    d2 = cabs(z2 - c2)
  7067. //    d3 = cabs(z3 - c3)
  7068. //    e1 = abs(d1 - s1)      ; lower bound
  7069. //    e2 = abs(d2 - s2)
  7070. //    e3 = abs(d3 - s3)
  7071. //    a1 = a1 + (cabs(z1) - e1) / (d1+s1 - e1)  ; update average
  7072. //    a2 = a2 + (cabs(z2) - e2) / (d2+s2 - e2)
  7073. //    a3 = a3 + (cabs(z3) - e3) / (d3+s3 - e3)
  7074.         }
  7075.  
  7076.         modz = |z1|;
  7077.         if  ((modz > bailout ||    everyiter ||      done == maxit + 2))
  7078.         {// done, or every iteration, or last
  7079.     // determine continuous iteration (height) for each point
  7080.             if  ((zmode == 0))
  7081.             {// height based on potential
  7082.                 e1 = (done + il2*lp - il2*log(log(cabs(z1)))) * zscale;
  7083.                 e2 = (done + il2*lp - il2*log(log(cabs(z2)))) * zscale;
  7084.                 e3 = (done + il2*lp - il2*log(log(cabs(z3)))) * zscale;
  7085.             }
  7086.             else if  ((zmode >= 1 && zmode <= 5))
  7087.             {// height based on smallest |z|
  7088.                 e1 = s1 * zscale;
  7089.                 e2 = s2 * zscale;
  7090.                 e3 = s3 * zscale;
  7091.             }
  7092.             else if  ((zmode == 6))
  7093.             {// height based on distance estimator
  7094.                 e1 = sqrt(2*log(cabs(z1)) * cabs(z1) / cabs(o1)) * zscale;
  7095.                 e2 = sqrt(2*log(cabs(z2)) * cabs(z2) / cabs(o2)) * zscale;
  7096.                 e3 = sqrt(2*log(cabs(z3)) * cabs(z3) / cabs(o3)) * zscale;
  7097. //    ELSEIF (@zmode == 7)    ; height based on triangle inequality
  7098. //      e1 = il2*lp - il2*log(log(cabs(z1))) ; fractional iterations
  7099. //      e2 = il2*lp - il2*log(log(cabs(z2)))
  7100. //      e3 = il2*lp - il2*log(log(cabs(z3)))
  7101. //      e1 = (oa1 + (a1-oa1) * (e1)) * @zscale  ; triangle inequality average, smoothed
  7102. //      e2 = (oa2 + (a2-oa2) * (e2)) * @zscale
  7103. //      e3 = (oa3 + (a3-oa3) * (e3)) * @zscale
  7104.             }
  7105.  
  7106.     // apply transfer function
  7107.     // a function is not used because these are floats
  7108.     // and not all functions apply to floats
  7109.             if  ((xfer == 1))
  7110.             {// log
  7111.                 e1 = log(e1);
  7112.                 e2 = log(e2);
  7113.                 e3 = log(e3);
  7114.             }
  7115.             else if  ((xfer == 2))
  7116.             {// sqrt
  7117.                 e1 = sqrt(e1);
  7118.                 e2 = sqrt(e2);
  7119.                 e3 = sqrt(e3);
  7120.             }
  7121.             else if  ((xfer == 3))
  7122.             {// cuberoot
  7123.                 e1 = (e1)^(1/3);
  7124.                 e2 = (e2)^(1/3);
  7125.                 e3 = (e3)^(1/3);
  7126.             }
  7127.             else if  ((xfer == 4))
  7128.             {// exp
  7129.                 e1 = exp(e1);
  7130.                 e2 = exp(e2);
  7131.                 e3 = exp(e3);
  7132.             }
  7133.             else if  ((xfer == 5))
  7134.             {// sqr
  7135.                 e1 = sqr(e1);
  7136.                 e2 = sqr(e2);
  7137.                 e3 = sqr(e3);
  7138.             }
  7139.             else if  ((xfer == 6))
  7140.             {// cube
  7141.                 e1 = (e1)^3;
  7142.                 e2 = (e2)^3;
  7143.                 e3 = (e3)^3;
  7144.             }
  7145.             else if  ((xfer == 7))
  7146.             {// sin
  7147.                 e1 = sin(e1);
  7148.                 e2 = sin(e2);
  7149.                 e3 = sin(e3);
  7150.             }
  7151.             else if  ((xfer == 8))
  7152.             {// cos
  7153.                 e1 = cos(e1);
  7154.                 e2 = cos(e2);
  7155.                 e3 = cos(e3);
  7156.             }
  7157.             else if  ((xfer == 9))
  7158.             {// tan
  7159.                 e1 = tan(e1);
  7160.                 e2 = tan(e2);
  7161.                 e3 = tan(e3);
  7162.             }
  7163.  
  7164.     // apply post-scale
  7165.             e1 = e1 * zscale2;
  7166.             e2 = e2 * zscale2;
  7167.             e3 = e3 * zscale2;
  7168.  
  7169. //    IF (@zmode == 0)      ; surface normal
  7170.       // determine surface normal
  7171.       // that is, the normal to the surface defined by:
  7172.       // (real(c1), imag(c1), e1)
  7173.       // (real(c2), imag(c2), e2)
  7174.       // (real(c3), imag(c3), e3)
  7175.             vx = e2-e1;
  7176.             vy = e3-e1;
  7177.             vz = -offset;
  7178.       // normalize vector
  7179.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  7180.             vx = vx*vd;
  7181.             vy = vy*vd;
  7182.             vz = vz*vd;
  7183.             z = vx + flip(vy);// fudge z from vector
  7184. //    ELSEIF (@zmode == 1)    ; potential
  7185. //      ; determine surface normal
  7186. //      ; that is, the normal to the surface defined by:
  7187. //      ; (real(z1), imag(z1), e1)
  7188. //      ; (real(z2), imag(z2), e2)
  7189. //      ; (real(z3), imag(z3), e3)
  7190. //      vx = imag(z2-z1)*(e3-e1) - (e2-e1)*imag(z3-z1)
  7191. //      vy = (e2-e1)*real(z3-z1) - real(z2-z1)*(e3-e1)
  7192. //      vz = real(z2-z1)*imag(z3-z1) - imag(z2-z1)*real(z3-z1)
  7193. //      ; normalize vector in 2D
  7194. //      vd = 1/sqrt(sqr(vx)+sqr(vy))
  7195. //      vx = vx*vd
  7196. //      vy = vy*vd
  7197. //      z = (vx + flip(vy)) * e1 * (c1/cabs(c1))
  7198. //    ENDIF
  7199.         }
  7200.         else
  7201.         {
  7202.           // didn't compute z this time
  7203.             z = z1;// use primary iteration value to keep periodicity working
  7204.         }
  7205.         if  ((modz > bailout))
  7206.         {// we're done
  7207.             done = 0;
  7208.         }
  7209.   
  7210.     }
  7211.     bool bailout(void)
  7212.     {
  7213.         return((done > 0));
  7214.   
  7215.     }
  7216.     void description(void)
  7217.     {
  7218.         this.title = "Slope (LambdaMandel)";
  7219.         this.helpfile = "dmj-pub\dmj-pub-uf-slope.htm";
  7220.         this.center = (1.0, 0.0);
  7221.         this.magn = 0.5;
  7222.         this.maxiter = 1000;
  7223.  
  7224.    
  7225.         start.caption = "Starting Point";
  7226.         start.default = (0.5,0.0);
  7227.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  7228.   
  7229.    
  7230.         power.caption = "Exponent";
  7231.         power.default = (2,0);
  7232.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  7233.   
  7234.    
  7235.         bailout.caption = "Bail-out Value";
  7236.         bailout.default = 1.0e20;
  7237.         bailout.min = 0.0;
  7238.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  7239.   
  7240.    
  7241.  
  7242.         offset.caption = "Orbit Separation";
  7243.         offset.default = 0.00000001;
  7244.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  7245.   
  7246.    
  7247.         zmode.caption = "Height Value";
  7248.         zmode.default = 6;
  7249.         zmode.enum = "potential\nsmallest |z|\nsmallest |real(z)|\nsmallest |imag(z)|\nsmallest summ(z)\nsmallest |atan(z)|\ndistance estimator" ;//"triangle inequality"
  7250.         zmode.hint = "Specifies what will be used to construct a height value.";
  7251.   
  7252.    
  7253.         xfer.caption = "Height Transfer";
  7254.         xfer.default = 0;
  7255.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  7256.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  7257.   
  7258.    
  7259.         zscale.caption = "Height Pre-Scale";
  7260.         zscale.default = 1.0;
  7261.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  7262.   
  7263.    
  7264.         zscale2.caption = "Height Post-Scale";
  7265.         zscale2.default = 0.025;
  7266.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  7267.   
  7268.    
  7269.         everyiter.caption = "Every Iteration";
  7270.         everyiter.default = false;
  7271.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  7272.   
  7273.  
  7274.     }
  7275. }
  7276.  
  7277.  
  7278. dmj-SlopeLyapJulia {
  7279. //
  7280. // This is the LambdaJulia set, but the calculations
  7281. // are modified so that z contains a surface normal
  7282. // to the set instead of the orbit value.  This is
  7283. // intended primarily for the Lighting coloring
  7284. // method, but might have interesting results for
  7285. // other methods, too.
  7286. //
  7287. complex z1;
  7288. complex z2;
  7289. parameter real offset;
  7290. complex z3;
  7291. int done;
  7292. real modz;
  7293. real il2;
  7294. parameter complex power;
  7295. real lp;
  7296. parameter real bailout;
  7297. real e1;
  7298. real e2;
  7299. real e3;
  7300. real vx;
  7301. real vy;
  7302. real vz;
  7303. real vd;
  7304. real d1;
  7305. real d2;
  7306. real d3;
  7307. real s1;
  7308. complex e20;
  7309. real s2;
  7310. real s3;
  7311. complex g1;
  7312. complex g2;
  7313. complex g3;
  7314. complex o1;
  7315. complex o2;
  7316. complex o3;
  7317. parameter complex seed;
  7318. parameter int zmode;
  7319. parameter bool everyiter;
  7320. parameter real zscale;
  7321. parameter int xfer;
  7322. parameter real zscale2;
  7323.  
  7324.     void init(void)
  7325.     {
  7326.         z1 = pixel;// primary iterated point
  7327.         z2 = pixel + offset;// horizontally offset point
  7328.         z3 = pixel + flip(offset);// vertically offset point
  7329. //  complex z1 = @start      ; starting value
  7330. //  complex z2 = @start
  7331. //  complex z3 = @start
  7332. //  complex z1 = @start      ; starting value
  7333. //  complex z2 = @start + @offset
  7334. //  complex z3 = @start + flip(@offset)
  7335.         done = 2;
  7336.         modz = 0.0;
  7337.         il2 = 1/log(real(power));// Inverse log 2 (precalc).
  7338.         lp = log(log(bailout));// log(log bailout) (precalc).
  7339.         e1 = 0.0;// potentials
  7340.         e2 = 0.0;
  7341.         e3 = 0.0;
  7342.         vx = 0.0;// normal vector
  7343.         vy = 0.0;
  7344.         vz = 0.0;
  7345.         vd = 0.0;
  7346.         d1 = 0.0;// distances
  7347.         d2 = 0.0;
  7348.         d3 = 0.0;
  7349.         s1 = 1.0e20;// smallest distances
  7350.         s2 = 1.0e20;
  7351.         s3 = 1.0e20;
  7352. //  float a1 = 0.0      ; averages
  7353. //  float a2 = 0.0
  7354. //  float a3 = 0.0
  7355. //  float oa1 = 0.0
  7356. //  float oa2 = 0.0
  7357. //  float oa3 = 0.0
  7358.         g1 = (0,0);// distance estimates
  7359.         g2 = (0,0);
  7360.         g3 = (0,0);
  7361.         o1 = (0,0);
  7362.         o2 = (0,0);
  7363.         o3 = (0,0);
  7364. //  IF (@zmode == 7)      ; triangle inequality
  7365. //    s1 = cabs(c1)      ; precalc
  7366. //    s2 = cabs(c2)
  7367. //    s3 = cabs(c3)
  7368. //  ENDIF
  7369.   
  7370.     }
  7371.     void loop(void)
  7372.     {
  7373. //  z = #pixel*z*(1-z)^(@power-1)
  7374.         z1 = seed*z1*(1-z1)^(power-1);// iterate each point
  7375.         z2 = seed*z2*(1-z2)^(power-1);// iterate each point
  7376.         z3 = seed*z3*(1-z3)^(power-1);// iterate each point
  7377.         done = done + 1;// increment iteration counter
  7378.  
  7379.         if  ((zmode == 1))
  7380.         {// smallest |z|
  7381.             d1 = |z1|;// get current distances from origin
  7382.             d2 = |z2|;
  7383.             d3 = |z3|;
  7384.             if  ((d1 < s1))
  7385.             {// update smallest distances
  7386.                 s1 = d1;
  7387.             }
  7388.             if  ((d2 < s2))
  7389.             {
  7390.                 s2 = d2;
  7391.             }
  7392.             if  ((d3 < s3))
  7393.             {
  7394.                 s3 = d3;
  7395.             }
  7396.         }
  7397.         else if  ((zmode == 2))
  7398.         {// smallest |real(z)|
  7399.             d1 = abs(real(z1));// get current distances from i axis
  7400.             d2 = abs(real(z2));
  7401.             d3 = abs(real(z3));
  7402.             if  ((d1 < s1))
  7403.             {// update smallest distances
  7404.                 s1 = d1;
  7405.             }
  7406.             if  ((d2 < s2))
  7407.             {
  7408.                 s2 = d2;
  7409.             }
  7410.             if  ((d3 < s3))
  7411.             {
  7412.                 s3 = d3;
  7413.             }
  7414.         }
  7415.         else if  ((zmode == 3))
  7416.         {// smallest |imag(z)|
  7417.             d1 = abs(imag(z1));// get current distances from r axis
  7418.             d2 = abs(imag(z2));
  7419.             d3 = abs(imag(z3));
  7420.             if  ((d1 < s1))
  7421.             {// update smallest distances
  7422.                 s1 = d1;
  7423.             }
  7424.             if  ((d2 < s2))
  7425.             {
  7426.                 s2 = d2;
  7427.             }
  7428.             if  ((d3 < s3))
  7429.             {
  7430.                 s3 = d3;
  7431.             }
  7432.         }
  7433.         else if  ((zmode == 4))
  7434.         {// smallest |real(z)|+|imag(z)|
  7435.             d1 = abs(real(z1))+abs(imag(z1));// get current distances from i axis
  7436.             d2 = abs(real(z2))+abs(imag(z2));
  7437.             d3 = abs(real(z3))+abs(imag(z3));
  7438.             if  ((d1 < s1))
  7439.             {// update smallest distances
  7440.                 s1 = d1;
  7441.             }
  7442.             if  ((d2 < s2))
  7443.             {
  7444.                 s2 = d2;
  7445.             }
  7446.             if  ((d3 < s3))
  7447.             {
  7448.                 s3 = d3;
  7449.             }
  7450.         }
  7451.         else if  ((zmode == 5))
  7452.         {// smallest |atan(z)|
  7453.             d1 = abs(atan2(z1));// get current angles
  7454.             d2 = abs(atan2(z2));
  7455.             d3 = abs(atan2(z3));
  7456.             if  ((d1 < s1))
  7457.             {// update smallest distances
  7458.                 s1 = d1;
  7459.             }
  7460.             if  ((d2 < s2))
  7461.             {
  7462.                 s2 = d2;
  7463.             }
  7464.             if  ((d3 < s3))
  7465.             {
  7466.                 s3 = d3;
  7467.             }
  7468.         }
  7469.         else if  ((zmode == 6))
  7470.         {// distance estimator
  7471.             o1 = g1;
  7472.             o2 = g2;
  7473.             o3 = g3;
  7474.             g1 = power * z1^(power-1) * g1 + 1;// update distance estimates
  7475.             g2 = power * z2^(power-1) * g2 + 1;
  7476.             g3 = power * z3^(power-1) * g3 + 1;
  7477. //  ELSEIF (@zmode == 7 && done > 3)  ; triangle inequality
  7478. //    oa1 = a1
  7479. //    oa2 = a2
  7480. //    oa3 = a3
  7481. //    d1 = cabs(z1 - c1)      ; |z|
  7482. //    d2 = cabs(z2 - c2)
  7483. //    d3 = cabs(z3 - c3)
  7484. //    e1 = abs(d1 - s1)      ; lower bound
  7485. //    e2 = abs(d2 - s2)
  7486. //    e3 = abs(d3 - s3)
  7487. //    a1 = a1 + (cabs(z1) - e1) / (d1+s1 - e1)  ; update average
  7488. //    a2 = a2 + (cabs(z2) - e2) / (d2+s2 - e2)
  7489. //    a3 = a3 + (cabs(z3) - e3) / (d3+s3 - e3)
  7490.         }
  7491.  
  7492.         modz = |z1|;
  7493.         if  ((modz > bailout ||    everyiter ||      done == maxit + 2))
  7494.         {// done, or every iteration, or last
  7495.     // determine continuous iteration (height) for each point
  7496.             if  ((zmode == 0))
  7497.             {// height based on potential
  7498.                 e1 = (done + il2*lp - il2*log(log(cabs(z1)))) * zscale;
  7499.                 e2 = (done + il2*lp - il2*log(log(cabs(z2)))) * zscale;
  7500.                 e3 = (done + il2*lp - il2*log(log(cabs(z3)))) * zscale;
  7501.             }
  7502.             else if  ((zmode >= 1 && zmode <= 5))
  7503.             {// height based on smallest |z|
  7504.                 e1 = s1 * zscale;
  7505.                 e2 = s2 * zscale;
  7506.                 e3 = s3 * zscale;
  7507.             }
  7508.             else if  ((zmode == 6))
  7509.             {// height based on distance estimator
  7510.                 e1 = sqrt(2*log(cabs(z1)) * cabs(z1) / cabs(o1)) * zscale;
  7511.                 e2 = sqrt(2*log(cabs(z2)) * cabs(z2) / cabs(o2)) * zscale;
  7512.                 e3 = sqrt(2*log(cabs(z3)) * cabs(z3) / cabs(o3)) * zscale;
  7513. //    ELSEIF (@zmode == 7)    ; height based on triangle inequality
  7514. //      e1 = il2*lp - il2*log(log(cabs(z1))) ; fractional iterations
  7515. //      e2 = il2*lp - il2*log(log(cabs(z2)))
  7516. //      e3 = il2*lp - il2*log(log(cabs(z3)))
  7517. //      e1 = (oa1 + (a1-oa1) * (e1)) * @zscale  ; triangle inequality average, smoothed
  7518. //      e2 = (oa2 + (a2-oa2) * (e2)) * @zscale
  7519. //      e3 = (oa3 + (a3-oa3) * (e3)) * @zscale
  7520.             }
  7521.  
  7522.     // apply transfer function
  7523.     // a function is not used because these are floats
  7524.     // and not all functions apply to floats
  7525.             if  ((xfer == 1))
  7526.             {// log
  7527.                 e1 = log(e1);
  7528.                 e2 = log(e2);
  7529.                 e3 = log(e3);
  7530.             }
  7531.             else if  ((xfer == 2))
  7532.             {// sqrt
  7533.                 e1 = sqrt(e1);
  7534.                 e2 = sqrt(e2);
  7535.                 e3 = sqrt(e3);
  7536.             }
  7537.             else if  ((xfer == 3))
  7538.             {// cuberoot
  7539.                 e1 = (e1)^(1/3);
  7540.                 e2 = (e2)^(1/3);
  7541.                 e3 = (e3)^(1/3);
  7542.             }
  7543.             else if  ((xfer == 4))
  7544.             {// exp
  7545.                 e1 = exp(e1);
  7546.                 e2 = exp(e2);
  7547.                 e3 = exp(e3);
  7548.             }
  7549.             else if  ((xfer == 5))
  7550.             {// sqr
  7551.                 e1 = sqr(e1);
  7552.                 e2 = sqr(e2);
  7553.                 e3 = sqr(e3);
  7554.             }
  7555.             else if  ((xfer == 6))
  7556.             {// cube
  7557.                 e1 = (e1)^3;
  7558.                 e2 = (e2)^3;
  7559.                 e3 = (e3)^3;
  7560.             }
  7561.             else if  ((xfer == 7))
  7562.             {// sin
  7563.                 e1 = sin(e1);
  7564.                 e2 = sin(e2);
  7565.                 e3 = sin(e3);
  7566.             }
  7567.             else if  ((xfer == 8))
  7568.             {// cos
  7569.                 e1 = cos(e1);
  7570.                 e2 = cos(e2);
  7571.                 e3 = cos(e3);
  7572.             }
  7573.             else if  ((xfer == 9))
  7574.             {// tan
  7575.                 e1 = tan(e1);
  7576.                 e2 = tan(e2);
  7577.                 e3 = tan(e3);
  7578.             }
  7579.  
  7580.     // apply post-scale
  7581.             e1 = e1 * zscale2;
  7582.             e2 = e2 * zscale2;
  7583.             e3 = e3 * zscale2;
  7584.  
  7585. //    IF (@zmode == 0)      ; surface normal
  7586.       // determine surface normal
  7587.       // that is, the normal to the surface defined by:
  7588.       // (real(c1), imag(c1), e1)
  7589.       // (real(c2), imag(c2), e2)
  7590.       // (real(c3), imag(c3), e3)
  7591.             vx = e2-e1;
  7592.             vy = e3-e1;
  7593.             vz = -offset;
  7594.       // normalize vector
  7595.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  7596.             vx = vx*vd;
  7597.             vy = vy*vd;
  7598.             vz = vz*vd;
  7599.             z = vx + flip(vy);// fudge z from vector
  7600. //    ELSEIF (@zmode == 1)    ; potential
  7601. //      ; determine surface normal
  7602. //      ; that is, the normal to the surface defined by:
  7603. //      ; (real(z1), imag(z1), e1)
  7604. //      ; (real(z2), imag(z2), e2)
  7605. //      ; (real(z3), imag(z3), e3)
  7606. //      vx = imag(z2-z1)*(e3-e1) - (e2-e1)*imag(z3-z1)
  7607. //      vy = (e2-e1)*real(z3-z1) - real(z2-z1)*(e3-e1)
  7608. //      vz = real(z2-z1)*imag(z3-z1) - imag(z2-z1)*real(z3-z1)
  7609. //      ; normalize vector in 2D
  7610. //      vd = 1/sqrt(sqr(vx)+sqr(vy))
  7611. //      vx = vx*vd
  7612. //      vy = vy*vd
  7613. //      z = (vx + flip(vy)) * e1 * (c1/cabs(c1))
  7614. //    ENDIF
  7615.         }
  7616.         else
  7617.         {
  7618.           // didn't compute z this time
  7619.             z = z1;// use primary iteration value to keep periodicity working
  7620.         }
  7621.         if  ((modz > bailout))
  7622.         {// we're done
  7623.             done = 0;
  7624.         }
  7625.   
  7626.     }
  7627.     bool bailout(void)
  7628.     {
  7629.         return((done > 0));
  7630.   
  7631.     }
  7632.     void description(void)
  7633.     {
  7634.         this.title = "Slope (LambdaJulia)";
  7635.         this.helpfile = "dmj-pub\dmj-pub-uf-slope.htm";
  7636.         this.center = (0.5, 0.0);
  7637.         this.magn = 0.5;
  7638.         this.maxiter = 1000;
  7639.  
  7640.    
  7641.         seed.caption = "Julia Seed";
  7642.         seed.default = (1,0);
  7643.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  7644.   
  7645.    
  7646.         power.caption = "Exponent";
  7647.         power.default = (2,0);
  7648.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  7649.   
  7650.    
  7651.         bailout.caption = "Bail-out Value";
  7652.         bailout.default = 1.0e20;
  7653.         bailout.min = 0.0;
  7654.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  7655.   
  7656.    
  7657.  
  7658.         offset.caption = "Orbit Separation";
  7659.         offset.default = 0.00000001;
  7660.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  7661.   
  7662.    
  7663.         zmode.caption = "Height Value";
  7664.         zmode.default = 6;
  7665.         zmode.enum = "potential\nsmallest |z|\nsmallest |real(z)|\nsmallest |imag(z)|\nsmallest summ(z)\nsmallest |atan(z)|\ndistance estimator" ;//"triangle inequality"
  7666.         zmode.hint = "Specifies what will be used to construct a height value.";
  7667.   
  7668.    
  7669.         xfer.caption = "Height Transfer";
  7670.         xfer.default = 0;
  7671.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  7672.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  7673.   
  7674.    
  7675.         zscale.caption = "Height Pre-Scale";
  7676.         zscale.default = 1.0;
  7677.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  7678.   
  7679.    
  7680.         zscale2.caption = "Height Post-Scale";
  7681.         zscale2.default = 0.025;
  7682.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  7683.   
  7684.    
  7685.         everyiter.caption = "Every Iteration";
  7686.         everyiter.default = false;
  7687.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  7688.   
  7689.  
  7690.     }
  7691. }
  7692.  
  7693.  
  7694. dmj-SlopeMandel {
  7695. //
  7696. // This is the Mandelbrot set, but the calculations
  7697. // are modified so that z contains a surface normal
  7698. // to the set instead of the orbit value.  This is
  7699. // intended primarily for the Lighting coloring
  7700. // method, but might have interesting results for
  7701. // other methods, too.
  7702. //
  7703. complex c1;
  7704. complex c2;
  7705. parameter real offset;
  7706. complex c3;
  7707. complex z1;
  7708. parameter complex start;
  7709. complex z2;
  7710. complex z3;
  7711. int done;
  7712. real modz;
  7713. real il2;
  7714. parameter complex power;
  7715. real lp;
  7716. parameter real bailout;
  7717. real e1;
  7718. real e2;
  7719. real e3;
  7720. real vx;
  7721. real vy;
  7722. real vz;
  7723. real vd;
  7724. real d1;
  7725. real d2;
  7726. real d3;
  7727. real s1;
  7728. complex e20;
  7729. real s2;
  7730. real s3;
  7731. complex g1;
  7732. complex g2;
  7733. complex g3;
  7734. complex o1;
  7735. complex o2;
  7736. complex o3;
  7737. parameter int zmode;
  7738. parameter bool everyiter;
  7739. parameter real zscale;
  7740. parameter int xfer;
  7741. parameter real zscale2;
  7742.  
  7743.     void init(void)
  7744.     {
  7745.         c1 = pixel;// primary iterated point
  7746.         c2 = pixel + offset;// horizontally offset point
  7747.         c3 = pixel + flip(offset);// vertically offset point
  7748.         z1 = start;// starting value
  7749.         z2 = start;
  7750.         z3 = start;
  7751.         done = 2;
  7752.         modz = 0.0;
  7753.         il2 = 1/log(real(power));// Inverse log 2 (precalc).
  7754.         lp = log(log(bailout));// log(log bailout) (precalc).
  7755.         e1 = 0.0;// potentials
  7756.         e2 = 0.0;
  7757.         e3 = 0.0;
  7758.         vx = 0.0;// normal vector
  7759.         vy = 0.0;
  7760.         vz = 0.0;
  7761.         vd = 0.0;
  7762.         d1 = 0.0;// distances
  7763.         d2 = 0.0;
  7764.         d3 = 0.0;
  7765.         s1 = 1.0e20;// smallest distances
  7766.         s2 = 1.0e20;
  7767.         s3 = 1.0e20;
  7768. //  float a1 = 0.0; averages
  7769. //  float a2 = 0.0
  7770. //  float a3 = 0.0
  7771. //  float oa1 = 0.0
  7772. //  float oa2 = 0.0
  7773. //  float oa3 = 0.0
  7774.         g1 = (0,0);// distance estimates
  7775.         g2 = (0,0);
  7776.         g3 = (0,0);
  7777.         o1 = (0,0);
  7778.         o2 = (0,0);
  7779.         o3 = (0,0);
  7780. //  IF (@zmode == 7); triangle inequality
  7781. //    s1 = cabs(c1); precalc
  7782. //    s2 = cabs(c2)
  7783. //    s3 = cabs(c3)
  7784. //  ENDIF
  7785.   
  7786.     }
  7787.     void loop(void)
  7788.     {
  7789.         z1 = z1^power + c1;// iterate each point
  7790.         z2 = z2^power + c2;
  7791.         z3 = z3^power + c3;
  7792.         done = done + 1;// increment iteration counter
  7793.  
  7794.         if  ((zmode == 1))
  7795.         {// smallest |z|
  7796.             d1 = |z1|;// get current distances from origin
  7797.             d2 = |z2|;
  7798.             d3 = |z3|;
  7799.             if  ((d1 < s1))
  7800.             {// update smallest distances
  7801.                 s1 = d1;
  7802.             }
  7803.             if  ((d2 < s2))
  7804.             {
  7805.                 s2 = d2;
  7806.             }
  7807.             if  ((d3 < s3))
  7808.             {
  7809.                 s3 = d3;
  7810.             }
  7811.         }
  7812.         else if  ((zmode == 2))
  7813.         {// smallest |real(z)|
  7814.             d1 = abs(real(z1));// get current distances from i axis
  7815.             d2 = abs(real(z2));
  7816.             d3 = abs(real(z3));
  7817.             if  ((d1 < s1))
  7818.             {// update smallest distances
  7819.                 s1 = d1;
  7820.             }
  7821.             if  ((d2 < s2))
  7822.             {
  7823.                 s2 = d2;
  7824.             }
  7825.             if  ((d3 < s3))
  7826.             {
  7827.                 s3 = d3;
  7828.             }
  7829.         }
  7830.         else if  ((zmode == 3))
  7831.         {// smallest |imag(z)|
  7832.             d1 = abs(imag(z1));// get current distances from r axis
  7833.             d2 = abs(imag(z2));
  7834.             d3 = abs(imag(z3));
  7835.             if  ((d1 < s1))
  7836.             {// update smallest distances
  7837.                 s1 = d1;
  7838.             }
  7839.             if  ((d2 < s2))
  7840.             {
  7841.                 s2 = d2;
  7842.             }
  7843.             if  ((d3 < s3))
  7844.             {
  7845.                 s3 = d3;
  7846.             }
  7847.         }
  7848.         else if  ((zmode == 4))
  7849.         {// smallest |real(z)|+|imag(z)|
  7850.             d1 = abs(real(z1))+abs(imag(z1));// get current distances from i axis
  7851.             d2 = abs(real(z2))+abs(imag(z2));
  7852.             d3 = abs(real(z3))+abs(imag(z3));
  7853.             if  ((d1 < s1))
  7854.             {// update smallest distances
  7855.                 s1 = d1;
  7856.             }
  7857.             if  ((d2 < s2))
  7858.             {
  7859.                 s2 = d2;
  7860.             }
  7861.             if  ((d3 < s3))
  7862.             {
  7863.                 s3 = d3;
  7864.             }
  7865.         }
  7866.         else if  ((zmode == 5))
  7867.         {// smallest |atan(z)|
  7868.             d1 = abs(atan2(z1));// get current angles
  7869.             d2 = abs(atan2(z2));
  7870.             d3 = abs(atan2(z3));
  7871.             if  ((d1 < s1))
  7872.             {// update smallest distances
  7873.                 s1 = d1;
  7874.             }
  7875.             if  ((d2 < s2))
  7876.             {
  7877.                 s2 = d2;
  7878.             }
  7879.             if  ((d3 < s3))
  7880.             {
  7881.                 s3 = d3;
  7882.             }
  7883.         }
  7884.         else if  ((zmode == 6))
  7885.         {// distance estimator
  7886.             o1 = g1;
  7887.             o2 = g2;
  7888.             o3 = g3;
  7889.             g1 = power * z1^(power-1) * g1 + 1;// update distance estimates
  7890.             g2 = power * z2^(power-1) * g2 + 1;
  7891.             g3 = power * z3^(power-1) * g3 + 1;
  7892. //  ELSEIF (@zmode == 7 && done > 3); triangle inequality
  7893. //    oa1 = a1
  7894. //    oa2 = a2
  7895. //    oa3 = a3
  7896. //    d1 = cabs(z1 - c1); |z|
  7897. //    d2 = cabs(z2 - c2)
  7898. //    d3 = cabs(z3 - c3)
  7899. //    e1 = abs(d1 - s1); lower bound
  7900. //    e2 = abs(d2 - s2)
  7901. //    e3 = abs(d3 - s3)
  7902. //    a1 = a1 + (cabs(z1) - e1) / (d1+s1 - e1); update average
  7903. //    a2 = a2 + (cabs(z2) - e2) / (d2+s2 - e2)
  7904. //    a3 = a3 + (cabs(z3) - e3) / (d3+s3 - e3)
  7905.         }
  7906.  
  7907.         modz = |z1|;
  7908.         if  ((modz > bailout ||everyiter ||done == maxit + 2))
  7909.         {// done, or every iteration, or last
  7910.     // determine continuous iteration (height) for each point
  7911.             if  ((zmode == 0))
  7912.             {// height based on potential
  7913.                 e1 = (done + il2*lp - il2*log(log(cabs(z1)))) * zscale;
  7914.                 e2 = (done + il2*lp - il2*log(log(cabs(z2)))) * zscale;
  7915.                 e3 = (done + il2*lp - il2*log(log(cabs(z3)))) * zscale;
  7916.             }
  7917.             else if  ((zmode >= 1 && zmode <= 5))
  7918.             {// height based on smallest |z|
  7919.                 e1 = s1 * zscale;
  7920.                 e2 = s2 * zscale;
  7921.                 e3 = s3 * zscale;
  7922.             }
  7923.             else if  ((zmode == 6))
  7924.             {// height based on distance estimator
  7925.                 e1 = sqrt(2*log(cabs(z1)) * cabs(z1) / cabs(o1)) * zscale;
  7926.                 e2 = sqrt(2*log(cabs(z2)) * cabs(z2) / cabs(o2)) * zscale;
  7927.                 e3 = sqrt(2*log(cabs(z3)) * cabs(z3) / cabs(o3)) * zscale;
  7928. //    ELSEIF (@zmode == 7); height based on triangle inequality
  7929. //      e1 = il2*lp - il2*log(log(cabs(z1))) ; fractional iterations
  7930. //      e2 = il2*lp - il2*log(log(cabs(z2)))
  7931. //      e3 = il2*lp - il2*log(log(cabs(z3)))
  7932. //      e1 = (oa1 + (a1-oa1) * (e1)) * @zscale; triangle inequality average, smoothed
  7933. //      e2 = (oa2 + (a2-oa2) * (e2)) * @zscale
  7934. //      e3 = (oa3 + (a3-oa3) * (e3)) * @zscale
  7935.             }
  7936.  
  7937.     // apply transfer function
  7938.     // a function is not used because these are floats
  7939.     // and not all functions apply to floats
  7940.             if  ((xfer == 1))
  7941.             {// log
  7942.                 e1 = log(e1);
  7943.                 e2 = log(e2);
  7944.                 e3 = log(e3);
  7945.             }
  7946.             else if  ((xfer == 2))
  7947.             {// sqrt
  7948.                 e1 = sqrt(e1);
  7949.                 e2 = sqrt(e2);
  7950.                 e3 = sqrt(e3);
  7951.             }
  7952.             else if  ((xfer == 3))
  7953.             {// cuberoot
  7954.                 e1 = (e1)^(1/3);
  7955.                 e2 = (e2)^(1/3);
  7956.                 e3 = (e3)^(1/3);
  7957.             }
  7958.             else if  ((xfer == 4))
  7959.             {// exp
  7960.                 e1 = exp(e1);
  7961.                 e2 = exp(e2);
  7962.                 e3 = exp(e3);
  7963.             }
  7964.             else if  ((xfer == 5))
  7965.             {// sqr
  7966.                 e1 = sqr(e1);
  7967.                 e2 = sqr(e2);
  7968.                 e3 = sqr(e3);
  7969.             }
  7970.             else if  ((xfer == 6))
  7971.             {// cube
  7972.                 e1 = (e1)^3;
  7973.                 e2 = (e2)^3;
  7974.                 e3 = (e3)^3;
  7975.             }
  7976.             else if  ((xfer == 7))
  7977.             {// sin
  7978.                 e1 = sin(e1);
  7979.                 e2 = sin(e2);
  7980.                 e3 = sin(e3);
  7981.             }
  7982.             else if  ((xfer == 8))
  7983.             {// cos
  7984.                 e1 = cos(e1);
  7985.                 e2 = cos(e2);
  7986.                 e3 = cos(e3);
  7987.             }
  7988.             else if  ((xfer == 9))
  7989.             {// tan
  7990.                 e1 = tan(e1);
  7991.                 e2 = tan(e2);
  7992.                 e3 = tan(e3);
  7993.             }
  7994.  
  7995.     // apply post-scale
  7996.             e1 = e1 * zscale2;
  7997.             e2 = e2 * zscale2;
  7998.             e3 = e3 * zscale2;
  7999.  
  8000. //    IF (@zmode == 0); surface normal
  8001.       // determine surface normal
  8002.       // that is, the normal to the surface defined by:
  8003.       // (real(c1), imag(c1), e1)
  8004.       // (real(c2), imag(c2), e2)
  8005.       // (real(c3), imag(c3), e3)
  8006.             vx = e2-e1;
  8007.             vy = e3-e1;
  8008.             vz = -offset;
  8009.       // normalize vector
  8010.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  8011.             vx = vx*vd;
  8012.             vy = vy*vd;
  8013.             vz = vz*vd;
  8014.             z = vx + flip(vy);// fudge z from vector
  8015. //    ELSEIF (@zmode == 1); potential
  8016. //      ; determine surface normal
  8017. //      ; that is, the normal to the surface defined by:
  8018. //      ; (real(z1), imag(z1), e1)
  8019. //      ; (real(z2), imag(z2), e2)
  8020. //      ; (real(z3), imag(z3), e3)
  8021. //      vx = imag(z2-z1)*(e3-e1) - (e2-e1)*imag(z3-z1)
  8022. //      vy = (e2-e1)*real(z3-z1) - real(z2-z1)*(e3-e1)
  8023. //      vz = real(z2-z1)*imag(z3-z1) - imag(z2-z1)*real(z3-z1)
  8024. //      ; normalize vector in 2D
  8025. //      vd = 1/sqrt(sqr(vx)+sqr(vy))
  8026. //      vx = vx*vd
  8027. //      vy = vy*vd
  8028. //      z = (vx + flip(vy)) * e1 * (c1/cabs(c1))
  8029. //    ENDIF
  8030.         }
  8031.         else
  8032.         {
  8033. // didn't compute z this time
  8034.             z = z1;// use primary iteration value to keep periodicity working
  8035.         }
  8036.         if  ((modz > bailout))
  8037.         {// we're done
  8038.             done = 0;
  8039.         }
  8040.   
  8041.     }
  8042.     bool bailout(void)
  8043.     {
  8044.         return((done > 0));
  8045.   
  8046.     }
  8047.     void description(void)
  8048.     {
  8049.         this.title = "Slope (Mandelbrot)";
  8050.         this.helpfile = "dmj-pub\dmj-pub-uf-slope.htm";
  8051.         this.center = (-0.5, 0.0);
  8052.         this.maxiter = 1000;
  8053.  
  8054.    
  8055.         start.caption = "Starting Point";
  8056.         start.default = (0,0);
  8057.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  8058.   
  8059.    
  8060.         power.caption = "Exponent";
  8061.         power.default = (2,0);
  8062.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  8063.   
  8064.    
  8065.         bailout.caption = "Bail-out Value";
  8066.         bailout.default = 1.0e20;
  8067.         bailout.min = 0.0;
  8068.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  8069.   
  8070.    
  8071.         offset.caption = "Orbit Separation";
  8072.         offset.default = 0.00000001;
  8073.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  8074.   
  8075.    
  8076.         zmode.caption = "Height Value";
  8077.         zmode.default = 6;
  8078.         zmode.enum = "potential\nsmallest |z|\nsmallest |real(z)|\nsmallest |imag(z)|\nsmallest summ(z)\nsmallest |atan(z)|\ndistance estimator" ;//"triangle inequality"
  8079.         zmode.hint = "Specifies what will be used to construct a height value.";
  8080.   
  8081.    
  8082.         xfer.caption = "Height Transfer";
  8083.         xfer.default = 0;
  8084.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  8085.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  8086.   
  8087.    
  8088.         zscale.caption = "Height Pre-Scale";
  8089.         zscale.default = 1.0;
  8090.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  8091.   
  8092.    
  8093.         zscale2.caption = "Height Post-Scale";
  8094.         zscale2.default = 0.025;
  8095.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  8096.   
  8097.    
  8098.         everyiter.caption = "Every Iteration";
  8099.         everyiter.default = false;
  8100.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  8101.   
  8102.  
  8103.     }
  8104. }
  8105.  
  8106.  
  8107. dmj-SlopeJulia {
  8108. //
  8109. // This is the Julia set, but the calculations
  8110. // are modified so that z contains a surface normal
  8111. // to the set instead of the orbit value.  This is
  8112. // intended primarily for the Lighting coloring
  8113. // method, but might have interesting results for
  8114. // other methods, too.
  8115. //
  8116. complex z1;
  8117. complex z2;
  8118. parameter real offset;
  8119. complex z3;
  8120. int done;
  8121. real modz;
  8122. real il2;
  8123. parameter complex power;
  8124. real lp;
  8125. parameter real bailout;
  8126. real e1;
  8127. real e2;
  8128. real e3;
  8129. real vx;
  8130. real vy;
  8131. real vz;
  8132. real vd;
  8133. real d1;
  8134. real d2;
  8135. real d3;
  8136. real s1;
  8137. complex e20;
  8138. real s2;
  8139. real s3;
  8140. complex g1;
  8141. complex g2;
  8142. complex g3;
  8143. complex o1;
  8144. complex o2;
  8145. complex o3;
  8146. parameter complex seed;
  8147. parameter int zmode;
  8148. parameter bool everyiter;
  8149. parameter real zscale;
  8150. parameter int xfer;
  8151. parameter real zscale2;
  8152.  
  8153.     void init(void)
  8154.     {
  8155.         z1 = pixel;// primary iterated point
  8156.         z2 = pixel + offset;// horizontally offset point
  8157.         z3 = pixel + flip(offset);// vertically offset point
  8158.         done = 2;
  8159.         modz = 0.0;
  8160.         il2 = 1/log(real(power));// Inverse log 2 (precalc).
  8161.         lp = log(log(bailout));// log(log bailout) (precalc).
  8162.         e1 = 0.0;// potentials
  8163.         e2 = 0.0;
  8164.         e3 = 0.0;
  8165.         vx = 0.0;// normal vector
  8166.         vy = 0.0;
  8167.         vz = 0.0;
  8168.         vd = 0.0;
  8169.         d1 = 0.0;// distances
  8170.         d2 = 0.0;
  8171.         d3 = 0.0;
  8172.         s1 = 1.0e20;// smallest distances
  8173.         s2 = 1.0e20;
  8174.         s3 = 1.0e20;
  8175.         g1 = (0,0);// distance estimates
  8176.         g2 = (0,0);
  8177.         g3 = (0,0);
  8178.         o1 = (0,0);
  8179.         o2 = (0,0);
  8180.         o3 = (0,0);
  8181.   
  8182.     }
  8183.     void loop(void)
  8184.     {
  8185.         z1 = z1^power + seed;// iterate each point
  8186.         z2 = z2^power + seed;
  8187.         z3 = z3^power + seed;
  8188.         done = done + 1;// increment iteration counter
  8189.  
  8190.         if  ((zmode == 1))
  8191.         {// smallest |z|
  8192.             d1 = |z1|;// get current distances from origin
  8193.             d2 = |z2|;
  8194.             d3 = |z3|;
  8195.             if  ((d1 < s1))
  8196.             {// update smallest distances
  8197.                 s1 = d1;
  8198.             }
  8199.             if  ((d2 < s2))
  8200.             {
  8201.                 s2 = d2;
  8202.             }
  8203.             if  ((d3 < s3))
  8204.             {
  8205.                 s3 = d3;
  8206.             }
  8207.         }
  8208.         else if  ((zmode == 2))
  8209.         {// smallest |real(z)|
  8210.             d1 = abs(real(z1));// get current distances from i axis
  8211.             d2 = abs(real(z2));
  8212.             d3 = abs(real(z3));
  8213.             if  ((d1 < s1))
  8214.             {// update smallest distances
  8215.                 s1 = d1;
  8216.             }
  8217.             if  ((d2 < s2))
  8218.             {
  8219.                 s2 = d2;
  8220.             }
  8221.             if  ((d3 < s3))
  8222.             {
  8223.                 s3 = d3;
  8224.             }
  8225.         }
  8226.         else if  ((zmode == 3))
  8227.         {// smallest |imag(z)|
  8228.             d1 = abs(imag(z1));// get current distances from r axis
  8229.             d2 = abs(imag(z2));
  8230.             d3 = abs(imag(z3));
  8231.             if  ((d1 < s1))
  8232.             {// update smallest distances
  8233.                 s1 = d1;
  8234.             }
  8235.             if  ((d2 < s2))
  8236.             {
  8237.                 s2 = d2;
  8238.             }
  8239.             if  ((d3 < s3))
  8240.             {
  8241.                 s3 = d3;
  8242.             }
  8243.         }
  8244.         else if  ((zmode == 4))
  8245.         {// smallest |real(z)|+|imag(z)|
  8246.             d1 = abs(real(z1))+abs(imag(z1));// get current distances from i axis
  8247.             d2 = abs(real(z2))+abs(imag(z2));
  8248.             d3 = abs(real(z3))+abs(imag(z3));
  8249.             if  ((d1 < s1))
  8250.             {// update smallest distances
  8251.                 s1 = d1;
  8252.             }
  8253.             if  ((d2 < s2))
  8254.             {
  8255.                 s2 = d2;
  8256.             }
  8257.             if  ((d3 < s3))
  8258.             {
  8259.                 s3 = d3;
  8260.             }
  8261.         }
  8262.         else if  ((zmode == 5))
  8263.         {// smallest |atan(z)|
  8264.             d1 = abs(atan2(z1));// get current angles
  8265.             d2 = abs(atan2(z2));
  8266.             d3 = abs(atan2(z3));
  8267.             if  ((d1 < s1))
  8268.             {// update smallest distances
  8269.                 s1 = d1;
  8270.             }
  8271.             if  ((d2 < s2))
  8272.             {
  8273.                 s2 = d2;
  8274.             }
  8275.             if  ((d3 < s3))
  8276.             {
  8277.                 s3 = d3;
  8278.             }
  8279.         }
  8280.         else if  ((zmode == 6))
  8281.         {// distance estimator
  8282.             o1 = g1;
  8283.             o2 = g2;
  8284.             o3 = g3;
  8285.             g1 = power * z1^(power-1) * g1 + 1;// update distance estimates
  8286.             g2 = power * z2^(power-1) * g2 + 1;
  8287.             g3 = power * z3^(power-1) * g3 + 1;
  8288.         }
  8289.  
  8290.         modz = |z1|;
  8291.         if  ((modz > bailout ||everyiter ||done == maxit + 2))
  8292.         {// done, or every iteration, or last
  8293.     // determine continuous iteration (height) for each point
  8294.             if  ((zmode == 0))
  8295.             {// height based on potential
  8296.                 e1 = (done + il2*lp - il2*log(log(cabs(z1)))) * zscale;
  8297.                 e2 = (done + il2*lp - il2*log(log(cabs(z2)))) * zscale;
  8298.                 e3 = (done + il2*lp - il2*log(log(cabs(z3)))) * zscale;
  8299.             }
  8300.             else if  ((zmode >= 1 && zmode <= 5))
  8301.             {// height based on smallest |z|
  8302.                 e1 = s1 * zscale;
  8303.                 e2 = s2 * zscale;
  8304.                 e3 = s3 * zscale;
  8305.             }
  8306.             else if  ((zmode == 6))
  8307.             {// height based on distance estimator
  8308.                 e1 = sqrt(2*log(cabs(z1)) * cabs(z1) / cabs(o1)) * zscale;
  8309.                 e2 = sqrt(2*log(cabs(z2)) * cabs(z2) / cabs(o2)) * zscale;
  8310.                 e3 = sqrt(2*log(cabs(z3)) * cabs(z3) / cabs(o3)) * zscale;
  8311.             }
  8312.  
  8313.     // apply transfer function
  8314.     // a function is not used because these are floats
  8315.     // and not all functions apply to floats
  8316.             if  ((xfer == 1))
  8317.             {// log
  8318.                 e1 = log(e1);
  8319.                 e2 = log(e2);
  8320.                 e3 = log(e3);
  8321.             }
  8322.             else if  ((xfer == 2))
  8323.             {// sqrt
  8324.                 e1 = sqrt(e1);
  8325.                 e2 = sqrt(e2);
  8326.                 e3 = sqrt(e3);
  8327.             }
  8328.             else if  ((xfer == 3))
  8329.             {// cuberoot
  8330.                 e1 = (e1)^(1/3);
  8331.                 e2 = (e2)^(1/3);
  8332.                 e3 = (e3)^(1/3);
  8333.             }
  8334.             else if  ((xfer == 4))
  8335.             {// exp
  8336.                 e1 = exp(e1);
  8337.                 e2 = exp(e2);
  8338.                 e3 = exp(e3);
  8339.             }
  8340.             else if  ((xfer == 5))
  8341.             {// sqr
  8342.                 e1 = sqr(e1);
  8343.                 e2 = sqr(e2);
  8344.                 e3 = sqr(e3);
  8345.             }
  8346.             else if  ((xfer == 6))
  8347.             {// cube
  8348.                 e1 = (e1)^3;
  8349.                 e2 = (e2)^3;
  8350.                 e3 = (e3)^3;
  8351.             }
  8352.             else if  ((xfer == 7))
  8353.             {// sin
  8354.                 e1 = sin(e1);
  8355.                 e2 = sin(e2);
  8356.                 e3 = sin(e3);
  8357.             }
  8358.             else if  ((xfer == 8))
  8359.             {// cos
  8360.                 e1 = cos(e1);
  8361.                 e2 = cos(e2);
  8362.                 e3 = cos(e3);
  8363.             }
  8364.             else if  ((xfer == 9))
  8365.             {// tan
  8366.                 e1 = tan(e1);
  8367.                 e2 = tan(e2);
  8368.                 e3 = tan(e3);
  8369.             }
  8370.  
  8371.     // apply post-scale
  8372.             e1 = e1 * zscale2;
  8373.             e2 = e2 * zscale2;
  8374.             e3 = e3 * zscale2;
  8375.  
  8376. //    IF (@zmode == 0); surface normal
  8377.       // determine surface normal
  8378.       // that is, the normal to the surface defined by:
  8379.       // (real(c1), imag(c1), e1)
  8380.       // (real(c2), imag(c2), e2)
  8381.       // (real(c3), imag(c3), e3)
  8382.             vx = e2-e1;
  8383.             vy = e3-e1;
  8384.             vz = -offset;
  8385.       // normalize vector
  8386.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  8387.             vx = vx*vd;
  8388.             vy = vy*vd;
  8389.             vz = vz*vd;
  8390.             z = vx + flip(vy);// fudge z from vector
  8391. //    ELSEIF (@zmode == 1); potential
  8392. //      ; determine surface normal
  8393. //      ; that is, the normal to the surface defined by:
  8394. //      ; (real(z1), imag(z1), e1)
  8395. //      ; (real(z2), imag(z2), e2)
  8396. //      ; (real(z3), imag(z3), e3)
  8397. //      vx = imag(z2-z1)*(e3-e1) - (e2-e1)*imag(z3-z1)
  8398. //      vy = (e2-e1)*real(z3-z1) - real(z2-z1)*(e3-e1)
  8399. //      vz = real(z2-z1)*imag(z3-z1) - imag(z2-z1)*real(z3-z1)
  8400. //      ; normalize vector in 2D
  8401. //      vd = 1/sqrt(sqr(vx)+sqr(vy))
  8402. //      vx = vx*vd
  8403. //      vy = vy*vd
  8404. //      z = (vx + flip(vy)) * e1 * (c1/cabs(c1))
  8405. //    ENDIF
  8406.         }
  8407.         else
  8408.         {
  8409. // didn't compute z this time
  8410.             z = z1;// use primary iteration value to keep periodicity working
  8411.         }
  8412.         if  ((modz > bailout))
  8413.         {// we're done
  8414.             done = 0;
  8415.         }
  8416.   
  8417.     }
  8418.     bool bailout(void)
  8419.     {
  8420.         return((done > 0));
  8421.   
  8422.     }
  8423.     void description(void)
  8424.     {
  8425.         this.title = "Slope (Julia)";
  8426.         this.helpfile = "dmj-pub\dmj-pub-uf-slope.htm";
  8427.         this.center = (0.0, 0.0);
  8428.         this.maxiter = 1000;
  8429.  
  8430.    
  8431.         seed.caption = "Julia Seed";
  8432.         seed.default = (0,0);
  8433.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  8434.   
  8435.    
  8436.         power.caption = "Exponent";
  8437.         power.default = (2,0);
  8438.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  8439.   
  8440.    
  8441.         bailout.caption = "Bail-out Value";
  8442.         bailout.default = 1.0e20;
  8443.         bailout.min = 0.0;
  8444.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  8445.   
  8446.    
  8447.         offset.caption = "Orbit Separation";
  8448.         offset.default = 0.00000001;
  8449.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  8450.   
  8451.    
  8452.         zmode.caption = "Height Value";
  8453.         zmode.default = 6;
  8454.         zmode.enum = "potential\nsmallest |z|\nsmallest |real(z)|\nsmallest |imag(z)|\nsmallest summ(z)\nsmallest |atan(z)|\ndistance estimator";
  8455.         zmode.hint = "Specifies what will be used to construct a height value.";
  8456.   
  8457.    
  8458.         xfer.caption = "Height Transfer";
  8459.         xfer.default = 0;
  8460.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  8461.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  8462.   
  8463.    
  8464.         zscale.caption = "Height Pre-Scale";
  8465.         zscale.default = 1.0;
  8466.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  8467.   
  8468.    
  8469.         zscale2.caption = "Height Post-Scale";
  8470.         zscale2.default = 0.025;
  8471.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  8472.   
  8473.    
  8474.         everyiter.caption = "Every Iteration";
  8475.         everyiter.default = false;
  8476.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  8477.   
  8478.  
  8479.     }
  8480. }
  8481.  
  8482.  
  8483. dmj-SlopeJulia2 {
  8484. //
  8485. // This is the Julia2 set, but the calculations
  8486. // are modified so that z contains a surface normal
  8487. // to the set instead of the orbit value.  This is
  8488. // intended primarily for the Lighting coloring
  8489. // method, but might have interesting results for
  8490. // other methods, too.
  8491. //
  8492. int p;
  8493. parameter real pattern;
  8494. int plength;
  8495. int pmul;
  8496. int pdigit;
  8497. bool t;
  8498. parameter bool switchseeds;
  8499. complex z1;
  8500. complex z2;
  8501. parameter real offset;
  8502. complex z3;
  8503. int done;
  8504. real modz;
  8505. real il2;
  8506. parameter complex power;
  8507. real lp;
  8508. parameter real bailout;
  8509. real e1;
  8510. real e2;
  8511. real e3;
  8512. real vx;
  8513. real vy;
  8514. real vz;
  8515. real vd;
  8516. real d1;
  8517. real d2;
  8518. real d3;
  8519. real s1;
  8520. complex e20;
  8521. real s2;
  8522. real s3;
  8523. complex g1;
  8524. complex g2;
  8525. complex g3;
  8526. complex o1;
  8527. complex o2;
  8528. complex o3;
  8529. parameter complex seed2;
  8530. parameter complex seed1;
  8531. parameter int zmode;
  8532. parameter bool everyiter;
  8533. parameter real zscale;
  8534. parameter int xfer;
  8535. parameter real zscale2;
  8536.  
  8537.     void init(void)
  8538.     {
  8539.         p = pattern;// Starting pattern
  8540.         plength = floor(log(p)/log(10));// number of digits in the pattern, - 1
  8541.         pmul = floor(10^plength);// multiplier to get leftmost digit
  8542.         pdigit = 0;// used for extracted digit
  8543.         t = false;
  8544.         if  ((p == 21 && switchseeds))
  8545.         {// special optimized pattern
  8546.             t = true;// start with the other seed
  8547.         }
  8548.  
  8549.         z1 = pixel;// primary iterated point
  8550.         z2 = pixel + offset;// horizontally offset point
  8551.         z3 = pixel + flip(offset);// vertically offset point
  8552.         done = 2;
  8553.         modz = 0.0;
  8554.         il2 = 1/log(real(power));// Inverse log 2 (precalc).
  8555.         lp = log(log(bailout));// log(log bailout) (precalc).
  8556.         e1 = 0.0;// potentials
  8557.         e2 = 0.0;
  8558.         e3 = 0.0;
  8559.         vx = 0.0;// normal vector
  8560.         vy = 0.0;
  8561.         vz = 0.0;
  8562.         vd = 0.0;
  8563.         d1 = 0.0;// distances
  8564.         d2 = 0.0;
  8565.         d3 = 0.0;
  8566.         s1 = 1.0e20;// smallest distances
  8567.         s2 = 1.0e20;
  8568.         s3 = 1.0e20;
  8569.         g1 = (0,0);// distance estimates
  8570.         g2 = (0,0);
  8571.         g3 = (0,0);
  8572.         o1 = (0,0);
  8573.         o2 = (0,0);
  8574.         o3 = (0,0);
  8575.   
  8576.     }
  8577.     void loop(void)
  8578.     {
  8579.         if  ((p == 21))
  8580.         {// special optimized pattern
  8581.             t = !t;// rotate pattern one step
  8582.             if  ((t))
  8583.             {// using second seed
  8584.                 z1 = z1^power + seed2;// iterate each point
  8585.                 z2 = z2^power + seed2;
  8586.                 z3 = z3^power + seed2;
  8587. //      z = z^@power + @seed2
  8588.             }
  8589.             else
  8590.             {
  8591. // using first seed
  8592.                 z1 = z1^power + seed1;// iterate each point
  8593.                 z2 = z2^power + seed1;
  8594.                 z3 = z3^power + seed1;
  8595. //      z = z^@power + @seed1
  8596.             }
  8597.  
  8598.         }
  8599.         else
  8600.         {
  8601.  
  8602.             pdigit = floor(p / pmul);// rotate pattern one step
  8603.             p = (p-pdigit*pmul)*10 + pdigit;
  8604.             if  ((switchseeds))
  8605.             {// seeds should be swapped
  8606.                 pdigit = 3 - pdigit;// use the other seed
  8607.             }
  8608.             if  ((pdigit == 1))
  8609.             {// using first seed
  8610.                 z1 = z1^power + seed1;// iterate each point
  8611.                 z2 = z2^power + seed1;
  8612.                 z3 = z3^power + seed1;
  8613. //      z = z^@power + @seed1
  8614.             }
  8615.             else
  8616.             {
  8617. // using second seed
  8618.                 z1 = z1^power + seed2;// iterate each point
  8619.                 z2 = z2^power + seed2;
  8620.                 z3 = z3^power + seed2;
  8621. //      z = z^@power + @seed2
  8622.             }
  8623.         }
  8624.  
  8625.         done = done + 1;// increment iteration counter
  8626.  
  8627.         if  ((zmode == 1))
  8628.         {// smallest |z|
  8629.             d1 = |z1|;// get current distances from origin
  8630.             d2 = |z2|;
  8631.             d3 = |z3|;
  8632.             if  ((d1 < s1))
  8633.             {// update smallest distances
  8634.                 s1 = d1;
  8635.             }
  8636.             if  ((d2 < s2))
  8637.             {
  8638.                 s2 = d2;
  8639.             }
  8640.             if  ((d3 < s3))
  8641.             {
  8642.                 s3 = d3;
  8643.             }
  8644.         }
  8645.         else if  ((zmode == 2))
  8646.         {// smallest |real(z)|
  8647.             d1 = abs(real(z1));// get current distances from i axis
  8648.             d2 = abs(real(z2));
  8649.             d3 = abs(real(z3));
  8650.             if  ((d1 < s1))
  8651.             {// update smallest distances
  8652.                 s1 = d1;
  8653.             }
  8654.             if  ((d2 < s2))
  8655.             {
  8656.                 s2 = d2;
  8657.             }
  8658.             if  ((d3 < s3))
  8659.             {
  8660.                 s3 = d3;
  8661.             }
  8662.         }
  8663.         else if  ((zmode == 3))
  8664.         {// smallest |imag(z)|
  8665.             d1 = abs(imag(z1));// get current distances from r axis
  8666.             d2 = abs(imag(z2));
  8667.             d3 = abs(imag(z3));
  8668.             if  ((d1 < s1))
  8669.             {// update smallest distances
  8670.                 s1 = d1;
  8671.             }
  8672.             if  ((d2 < s2))
  8673.             {
  8674.                 s2 = d2;
  8675.             }
  8676.             if  ((d3 < s3))
  8677.             {
  8678.                 s3 = d3;
  8679.             }
  8680.         }
  8681.         else if  ((zmode == 4))
  8682.         {// smallest |real(z)|+|imag(z)|
  8683.             d1 = abs(real(z1))+abs(imag(z1));// get current distances from i axis
  8684.             d2 = abs(real(z2))+abs(imag(z2));
  8685.             d3 = abs(real(z3))+abs(imag(z3));
  8686.             if  ((d1 < s1))
  8687.             {// update smallest distances
  8688.                 s1 = d1;
  8689.             }
  8690.             if  ((d2 < s2))
  8691.             {
  8692.                 s2 = d2;
  8693.             }
  8694.             if  ((d3 < s3))
  8695.             {
  8696.                 s3 = d3;
  8697.             }
  8698.         }
  8699.         else if  ((zmode == 5))
  8700.         {// smallest |atan(z)|
  8701.             d1 = abs(atan2(z1));// get current angles
  8702.             d2 = abs(atan2(z2));
  8703.             d3 = abs(atan2(z3));
  8704.             if  ((d1 < s1))
  8705.             {// update smallest distances
  8706.                 s1 = d1;
  8707.             }
  8708.             if  ((d2 < s2))
  8709.             {
  8710.                 s2 = d2;
  8711.             }
  8712.             if  ((d3 < s3))
  8713.             {
  8714.                 s3 = d3;
  8715.             }
  8716.         }
  8717.         else if  ((zmode == 6))
  8718.         {// distance estimator
  8719.             o1 = g1;
  8720.             o2 = g2;
  8721.             o3 = g3;
  8722.             g1 = power * z1^(power-1) * g1 + 1;// update distance estimates
  8723.             g2 = power * z2^(power-1) * g2 + 1;
  8724.             g3 = power * z3^(power-1) * g3 + 1;
  8725.         }
  8726.  
  8727.         modz = |z1|;
  8728.         if  ((modz > bailout ||everyiter ||done == maxit + 2))
  8729.         {// done, or every iteration, or last
  8730.     // determine continuous iteration (height) for each point
  8731.             if  ((zmode == 0))
  8732.             {// height based on potential
  8733.                 e1 = (done + il2*lp - il2*log(log(cabs(z1)))) * zscale;
  8734.                 e2 = (done + il2*lp - il2*log(log(cabs(z2)))) * zscale;
  8735.                 e3 = (done + il2*lp - il2*log(log(cabs(z3)))) * zscale;
  8736.             }
  8737.             else if  ((zmode >= 1 && zmode <= 5))
  8738.             {// height based on smallest |z|
  8739.                 e1 = s1 * zscale;
  8740.                 e2 = s2 * zscale;
  8741.                 e3 = s3 * zscale;
  8742.             }
  8743.             else if  ((zmode == 6))
  8744.             {// height based on distance estimator
  8745.                 e1 = sqrt(2*log(cabs(z1)) * cabs(z1) / cabs(o1)) * zscale;
  8746.                 e2 = sqrt(2*log(cabs(z2)) * cabs(z2) / cabs(o2)) * zscale;
  8747.                 e3 = sqrt(2*log(cabs(z3)) * cabs(z3) / cabs(o3)) * zscale;
  8748.             }
  8749.  
  8750.     // apply transfer function
  8751.     // a function is not used because these are floats
  8752.     // and not all functions apply to floats
  8753.             if  ((xfer == 1))
  8754.             {// log
  8755.                 e1 = log(e1);
  8756.                 e2 = log(e2);
  8757.                 e3 = log(e3);
  8758.             }
  8759.             else if  ((xfer == 2))
  8760.             {// sqrt
  8761.                 e1 = sqrt(e1);
  8762.                 e2 = sqrt(e2);
  8763.                 e3 = sqrt(e3);
  8764.             }
  8765.             else if  ((xfer == 3))
  8766.             {// cuberoot
  8767.                 e1 = (e1)^(1/3);
  8768.                 e2 = (e2)^(1/3);
  8769.                 e3 = (e3)^(1/3);
  8770.             }
  8771.             else if  ((xfer == 4))
  8772.             {// exp
  8773.                 e1 = exp(e1);
  8774.                 e2 = exp(e2);
  8775.                 e3 = exp(e3);
  8776.             }
  8777.             else if  ((xfer == 5))
  8778.             {// sqr
  8779.                 e1 = sqr(e1);
  8780.                 e2 = sqr(e2);
  8781.                 e3 = sqr(e3);
  8782.             }
  8783.             else if  ((xfer == 6))
  8784.             {// cube
  8785.                 e1 = (e1)^3;
  8786.                 e2 = (e2)^3;
  8787.                 e3 = (e3)^3;
  8788.             }
  8789.             else if  ((xfer == 7))
  8790.             {// sin
  8791.                 e1 = sin(e1);
  8792.                 e2 = sin(e2);
  8793.                 e3 = sin(e3);
  8794.             }
  8795.             else if  ((xfer == 8))
  8796.             {// cos
  8797.                 e1 = cos(e1);
  8798.                 e2 = cos(e2);
  8799.                 e3 = cos(e3);
  8800.             }
  8801.             else if  ((xfer == 9))
  8802.             {// tan
  8803.                 e1 = tan(e1);
  8804.                 e2 = tan(e2);
  8805.                 e3 = tan(e3);
  8806.             }
  8807.  
  8808.     // apply post-scale
  8809.             e1 = e1 * zscale2;
  8810.             e2 = e2 * zscale2;
  8811.             e3 = e3 * zscale2;
  8812.  
  8813. //    IF (@zmode == 0); surface normal
  8814.       // determine surface normal
  8815.       // that is, the normal to the surface defined by:
  8816.       // (real(c1), imag(c1), e1)
  8817.       // (real(c2), imag(c2), e2)
  8818.       // (real(c3), imag(c3), e3)
  8819.             vx = e2-e1;
  8820.             vy = e3-e1;
  8821.             vz = -offset;
  8822.       // normalize vector
  8823.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  8824.             vx = vx*vd;
  8825.             vy = vy*vd;
  8826.             vz = vz*vd;
  8827.             z = vx + flip(vy);// fudge z from vector
  8828. //    ELSEIF (@zmode == 1); potential
  8829. //      ; determine surface normal
  8830. //      ; that is, the normal to the surface defined by:
  8831. //      ; (real(z1), imag(z1), e1)
  8832. //      ; (real(z2), imag(z2), e2)
  8833. //      ; (real(z3), imag(z3), e3)
  8834. //      vx = imag(z2-z1)*(e3-e1) - (e2-e1)*imag(z3-z1)
  8835. //      vy = (e2-e1)*real(z3-z1) - real(z2-z1)*(e3-e1)
  8836. //      vz = real(z2-z1)*imag(z3-z1) - imag(z2-z1)*real(z3-z1)
  8837. //      ; normalize vector in 2D
  8838. //      vd = 1/sqrt(sqr(vx)+sqr(vy))
  8839. //      vx = vx*vd
  8840. //      vy = vy*vd
  8841. //      z = (vx + flip(vy)) * e1 * (c1/cabs(c1))
  8842. //    ENDIF
  8843.         }
  8844.         else
  8845.         {
  8846. // didn't compute z this time
  8847.             z = z1;// use primary iteration value to keep periodicity working
  8848.         }
  8849.         if  ((modz > bailout))
  8850.         {// we're done
  8851.             done = 0;
  8852.         }
  8853.   
  8854.     }
  8855.     bool bailout(void)
  8856.     {
  8857.         return((done > 0));
  8858.   
  8859.     }
  8860.     void description(void)
  8861.     {
  8862.         this.title = "Slope (Julia2)";
  8863.         this.helpfile = "dmj-pub\dmj-pub-uf-slope.htm";
  8864.         this.center = (0.0, 0.0);
  8865.         this.maxiter = 1000;
  8866.  
  8867.    
  8868.         seed1.caption = "Julia Seed 1";
  8869.         seed1.default = (0,0);
  8870.         seed1.hint = "This is the first Julia seed, a constant parameter which defines the shape of the fractal.";
  8871.   
  8872.    
  8873.         seed2.caption = "Julia Seed 2";
  8874.         seed2.default = (0,0);
  8875.         seed2.hint = "This is the second Julia seed, a constant parameter which defines the shape of the fractal.";
  8876.   
  8877.    
  8878.         switchseeds.caption = "Switch Seeds";
  8879.         switchseeds.default = FALSE;
  8880.         switchseeds.hint = "If this is enabled, the Julia seeds will be swapped.  This lets you try the alternate 'flavor' Julia2 without manually swapping the parameters.";
  8881.   
  8882.    
  8883.         pattern.caption = "Seed Pattern";
  8884.         pattern.default = 21;
  8885.         pattern.min = 12;
  8886.         pattern.hint = "Defines the pattern in which the two seeds will be used. Each digit indicates the seed to use, 1 or 2; when all digits have been used, the pattern repeats.  The default of 21 gives the original Julia2 behavior.";
  8887.   
  8888.    
  8889.         power.caption = "Exponent";
  8890.         power.default = (2,0);
  8891.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  8892.   
  8893.    
  8894.         bailout.caption = "Bail-out Value";
  8895.         bailout.default = 1.0e20;
  8896.         bailout.min = 0.0;
  8897.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  8898.   
  8899.    
  8900.         offset.caption = "Orbit Separation";
  8901.         offset.default = 0.00000001;
  8902.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  8903.   
  8904.    
  8905.         zmode.caption = "Height Value";
  8906.         zmode.default = 6;
  8907.         zmode.enum = "potential\nsmallest |z|\nsmallest |real(z)|\nsmallest |imag(z)|\nsmallest summ(z)\nsmallest |atan(z)|\ndistance estimator";
  8908.         zmode.hint = "Specifies what will be used to construct a height value.";
  8909.   
  8910.    
  8911.         xfer.caption = "Height Transfer";
  8912.         xfer.default = 0;
  8913.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  8914.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  8915.   
  8916.    
  8917.         zscale.caption = "Height Pre-Scale";
  8918.         zscale.default = 1.0;
  8919.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  8920.   
  8921.    
  8922.         zscale2.caption = "Height Post-Scale";
  8923.         zscale2.default = 0.025;
  8924.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  8925.   
  8926.    
  8927.         everyiter.caption = "Every Iteration";
  8928.         everyiter.default = false;
  8929.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  8930.   
  8931.  
  8932.     }
  8933. }
  8934.  
  8935.  
  8936. dmj-Slope2Mandel {
  8937. //
  8938. // This is the Mandelbrot set, but the calculations
  8939. // are modified so that z contains a surface normal
  8940. // to the set instead of the orbit value.  This is
  8941. // intended primarily for the Lighting coloring
  8942. // method, but might have interesting results for
  8943. // other methods, too.
  8944. //
  8945. complex c1;
  8946. complex c2;
  8947. parameter real offset;
  8948. complex c3;
  8949. complex z1;
  8950. parameter complex start;
  8951. complex z2;
  8952. complex z3;
  8953. real modz;
  8954. real e1;
  8955. real e2;
  8956. real e3;
  8957. real vx;
  8958. real vy;
  8959. real vz;
  8960. real vd;
  8961. int j;
  8962. real closest;
  8963. complex e38;
  8964. real closest1;
  8965. real d;
  8966. real d2;
  8967. complex point;
  8968. complex point1;
  8969. complex point2;
  8970. complex point3;
  8971. complex zT;
  8972. complex zP;
  8973. complex cT;
  8974. bool done;
  8975. int i;
  8976. int i1;
  8977. int iter;
  8978. real fiter;
  8979. parameter real trapstart;
  8980. bool trapping;
  8981. real diameter2;
  8982. parameter real diameter;
  8983. real r1;
  8984. parameter real Parm_angle;
  8985. real r2;
  8986. parameter real anglestep;
  8987. real s1;
  8988. parameter real skew;
  8989. real s2;
  8990. parameter real skewstep;
  8991. complex r;
  8992. complex r0;
  8993. complex s;
  8994. complex rh;
  8995. parameter real traporder;
  8996. complex zh;
  8997. complex trapcenter2;
  8998. parameter complex trapcenter;
  8999. parameter bool movetrap;
  9000. parameter int trapshape;
  9001. parameter int traptype;
  9002. int z1i;
  9003. int z2i;
  9004. int z3i;
  9005. int z1i1;
  9006. int z2i1;
  9007. int z3i1;
  9008. real z1closest;
  9009. real z2closest;
  9010. real z3closest;
  9011. real z1closest1;
  9012. real z2closest1;
  9013. real z3closest1;
  9014. complex z1point;
  9015. complex z2point;
  9016. complex z3point;
  9017. complex z1point1;
  9018. complex z2point1;
  9019. complex z3point1;
  9020. complex z1point2;
  9021. complex z2point2;
  9022. complex z3point2;
  9023. complex z1point3;
  9024. complex z2point3;
  9025. complex z3point3;
  9026. parameter complex power;
  9027. parameter real trapskip;
  9028. parameter real trapiter;
  9029. parameter complex trapdrift;
  9030. parameter complex traporbit;
  9031. parameter real gausss;
  9032. parameter real gaussr;
  9033. parameter complex gausscenter;
  9034. parameter int radialmode;
  9035. parameter real gauss;
  9036. parameter complex gaussgcenter;
  9037. parameter real aspect;
  9038. parameter real trapfreq;
  9039. parameter real prescale;
  9040. parameter int trapfunc;
  9041. parameter real postscale;
  9042. parameter bool trapabs;
  9043. parameter real threshold;
  9044. parameter real bailout;
  9045. parameter bool everyiter;
  9046. parameter int trapcolor;
  9047. parameter real zscale;
  9048. parameter int xfer;
  9049. parameter real zscale2;
  9050.  
  9051.     void init(void)
  9052.     {
  9053.         c1 = pixel;// primary iterated point
  9054.         c2 = pixel + offset;// horizontally offset point
  9055.         c3 = pixel + flip(offset);// vertically offset point
  9056.         z1 = start;// starting value
  9057.         z2 = start;
  9058.         z3 = start;
  9059.         modz = 0.0;
  9060. //  float il2 = 1/log(real(@power)); Inverse log 2 (precalc).
  9061. //  float lp = log(log(@bailout)); log(log bailout) (precalc).
  9062.         e1 = 0.0;// heights
  9063.         e2 = 0.0;
  9064.         e3 = 0.0;
  9065.         vx = 0.0;// normal vector
  9066.         vy = 0.0;
  9067.         vz = 0.0;
  9068.         vd = 0.0;
  9069.         j = 0;
  9070.  
  9071.   // trap variables
  9072.         closest = 1e38;
  9073.         closest1 = 1e38;
  9074.         d = 0.0;
  9075.         d2 = 0.0;
  9076.         point = (0,0);
  9077.         point1 = (0,0);
  9078.         point2 = (0,0);
  9079.         point3 = (0,0);
  9080.         zT = (0,0);
  9081.         zP = (0,0);
  9082.         cT = (0,0);
  9083.         done = false;
  9084.         i = 0;
  9085.         i1 = 0;
  9086.         iter = 0;
  9087.         fiter = trapstart;
  9088.         trapping = false;
  9089.         diameter2 = sqr(diameter);
  9090.         r1 = Parm_angle / 90.0;
  9091.         r2 = anglestep / 90.0;
  9092.         s1 = skew / 90.0;
  9093.         s2 = skewstep / 90.0;
  9094.         r = (0,1) ^ r1;
  9095.         r0 = (0,0);
  9096.         s = (0,1) ^ s1;
  9097.         rh = (0,1) ^ (traporder / 8);// heart rotation value
  9098.         zh = (0,0);
  9099.         trapcenter2 = trapcenter;
  9100.  
  9101.         if  ((movetrap))
  9102.         {// Trap Center follows pixel
  9103.             trapcenter2 = pixel + trapcenter;
  9104.         }
  9105.  
  9106.         if  ((trapshape >= 17 || trapshape <= 19))
  9107.         {// ripple shapes
  9108.             diameter2 = pi / diameter;
  9109.         }
  9110.  
  9111.         if  ((traptype == 1 || traptype == 4 || traptype == 5 || traptype == 7 || traptype == 12 || traptype == 13 || traptype == 14 || traptype == 15 || traptype == 16 || traptype == 17 || traptype == 18))
  9112.         {// last, sum, average, sign average
  9113.             closest = 0.0;
  9114.         }
  9115.         else if  ((traptype == 6))
  9116.         {// product
  9117.             closest = 1.0;
  9118.         }
  9119.         else if  ((traptype == 9 || traptype == 11))
  9120.         {// second/two farthest
  9121.             closest = 0.0;
  9122.             closest1 = 0.0;
  9123.         }
  9124. //  BOOL usesolid = true
  9125.   
  9126.   // extra copies of trap state variables
  9127.         z1i = 0;
  9128.         z2i = 0;
  9129.         z3i = 0;
  9130.         z1i1 = 0;
  9131.         z2i1 = 0;
  9132.         z3i1 = 0;
  9133.         z1closest = closest;
  9134.         z2closest = closest;
  9135.         z3closest = closest;
  9136.         z1closest1 = closest1;
  9137.         z2closest1 = closest1;
  9138.         z3closest1 = closest1;
  9139.         z1point = 0;
  9140.         z2point = 0;
  9141.         z3point = 0;
  9142.         z1point1 = 0;
  9143.         z2point1 = 0;
  9144.         z3point1 = 0;
  9145.         z1point2 = 0;
  9146.         z2point2 = 0;
  9147.         z3point2 = 0;
  9148.         z1point3 = 0;
  9149.         z2point3 = 0;
  9150.         z3point3 = 0;
  9151.   
  9152.     }
  9153.     void loop(void)
  9154.     {
  9155.         z1 = z1^power + c1;// iterate each point
  9156.         z2 = z2^power + c2;
  9157.         z3 = z3^power + c3;
  9158.  
  9159.   // update height value as necessary
  9160.  
  9161.         iter = iter + 1;// iteration counter
  9162.         if  ((trapskip != 0))
  9163.         {// we are skipping some iterations
  9164.             fiter = fiter - 1;// one less to go before we trap
  9165.             while  ((fiter < 0.0))
  9166.             {// iterations all used up
  9167.                 if  ((trapping))
  9168.                 {// we are currently trapping
  9169.                     trapping = false;// so stop
  9170.                     fiter = fiter + trapskip;// skip this many iterations
  9171.                 }
  9172.                 else
  9173.                 {
  9174. // we aren't currently trapping
  9175.                     trapping = true;// so start
  9176.                     fiter = fiter + trapiter;// do this many iterations
  9177.                 }
  9178.             }
  9179.         }
  9180.  
  9181.         if  ((trapskip == 0.0 || trapping))
  9182.         {// if we're checking for traps...
  9183.  
  9184.     // adjust rotation/skew/trapcenter
  9185.             if  ((anglestep != 0))
  9186.             {// changing rotation angle.
  9187.                 r = (0,1) ^ (r1+r2*(iter-1));
  9188.             }
  9189.             if  ((skewstep != 0))
  9190.             {// changing skew angle.
  9191.                 s = (0,1) ^ (s1+s2*(iter-1));
  9192.             }
  9193.             if  ((trapdrift != (0,0)))
  9194.             {// changing trap center
  9195.                 trapcenter2 = trapcenter2 + trapdrift;
  9196.             }
  9197.             if  ((traporbit != (0,0)))
  9198.             {// changing trap orbit
  9199.                 trapcenter2 = trapcenter2 * traporbit;
  9200.             }
  9201.  
  9202.             j = 0;
  9203.             while  ((j < 3))
  9204.             {
  9205.                 if  ((j == 0))
  9206.                 {
  9207.                     zP = z1;
  9208.                     cT = pixel;
  9209.                     closest = z1closest;
  9210.                     closest1 = z1closest1;
  9211.                     i = z1i;
  9212.                     i1 = z1i1;
  9213.                     point = z1point;
  9214.                     point1 = z1point1;
  9215.                     point2 = z1point2;
  9216.                     point3 = z1point3;
  9217.                 }
  9218.                 else if  ((j == 1))
  9219.                 {
  9220.                     zP = z2;
  9221.                     cT = pixel + offset;
  9222.                     closest = z2closest;
  9223.                     closest1 = z2closest1;
  9224.                     i = z2i;
  9225.                     i1 = z2i1;
  9226.                     point = z2point;
  9227.                     point1 = z2point1;
  9228.                     point2 = z2point2;
  9229.                     point3 = z2point3;
  9230.                 }
  9231.                 else
  9232.                 {
  9233.  
  9234.                     zP = z3;
  9235.                     cT = pixel + flip(offset);
  9236.                     closest = z3closest;
  9237.                     closest1 = z3closest1;
  9238.                     i = z3i;
  9239.                     i1 = z3i1;
  9240.                     point = z3point;
  9241.                     point1 = z3point1;
  9242.                     point2 = z3point2;
  9243.                     point3 = z3point3;
  9244.                 }
  9245.  
  9246.     // rotate/squash/skew/repeat z
  9247.                 if  ((traptype == 18))
  9248.                 {// trap only, work on unadulterated pixel
  9249.                     zT = cT;
  9250.                 }
  9251.                 else
  9252.                 {
  9253. // some other trap mode, use z
  9254.                     zT = zP;
  9255.                 }
  9256.     // 1. radially repeat
  9257.                 if  ((gausss > 0 && gaussr == 0))
  9258.                 {// concentrically repeating trap, but not radial
  9259.                     zT = zT - gausscenter;
  9260.                     d = cabs(zT);
  9261.                     d = ((d / gausss) - round(d / gausss)) * gausss;
  9262.                     zT = zT * d / cabs(zT) + gausscenter;
  9263.                 }
  9264.                 if  ((gaussr > 0.0))
  9265.                 {// radially repeating trap
  9266.                     zT = zT - gausscenter;
  9267.                     d = cabs(zT);
  9268.                     d2 = atan(imag(zT)/real(zT));
  9269.                     if  ((real(zT) < 0))
  9270.                     {
  9271.                         d2 = d2 + pi;
  9272.                     }
  9273.                     if  ((d2 < 0))
  9274.                     {
  9275.                         d2 = d2 + 2*pi;
  9276.                     }
  9277.                     d2 = d2 / (pi*2);
  9278.                     d2 = ((d2 * gaussr) - round(d2 * gaussr)) / gaussr * pi*2;
  9279.                     if  ((gausss > 0))
  9280.                     {// concentrically repeating trap
  9281.                         d = ((d / gausss) - round(d / gausss)) * gausss;
  9282.                     }
  9283.                     if  ((radialmode == 0))
  9284.                     {// standard radial repeat mode
  9285.                         zT = cos(d2)*d + flip(sin(d2)*d) + gausscenter;
  9286.                     }
  9287.                     else if  ((radialmode == 1))
  9288.                     {// unwrap mode
  9289.                         zT = d + flip(d2);
  9290.                     }
  9291.                 }
  9292.     // 2. grid repeat
  9293.                 if  ((gauss > 0))
  9294.                 {// repeating trap
  9295.                     zT = zT - gaussgcenter;
  9296.                     zT = ((zT / gauss) - round(zT / gauss)) * gauss;
  9297.                     zT = zT + gaussgcenter;
  9298.                 }
  9299.     // 3. rotate
  9300.                 zT = (zT - trapcenter2) * r;// rotate
  9301.     // 4. apply aspect
  9302.                 if  ((aspect != 1.0))
  9303.                 {
  9304.                     zT = real(zT) + flip(imag(zT) * aspect);// apply aspect
  9305.                 }
  9306.     // 5. skew
  9307.                 zT = real(zT * s) + flip(imag(zT));// apply skew
  9308.  
  9309.     // determine distance from trap--different for each shape
  9310.                 if  ((trapshape == 0))
  9311.                 {// point
  9312.                     d = cabs(zT);
  9313.                 }
  9314.                 else if  ((trapshape == 1))
  9315.                 {// ring
  9316.                     d = abs(cabs(zT) - diameter);
  9317.                 }
  9318.                 else if  ((trapshape == 2))
  9319.                 {// ring2
  9320.                     d = abs(|zT| - diameter2);
  9321.                 }
  9322.                 else if  ((trapshape == 3))
  9323.                 {// egg
  9324.                     d = (cabs(zT-flip(diameter)*2) + cabs(zT)*traporder*0.5) * 0.25;
  9325.                 }
  9326.                 else if  ((trapshape == 4))
  9327.                 {// hyperbola
  9328.                     d = abs(imag(zT) * real(zT) - diameter);
  9329.                 }
  9330.                 else if  ((trapshape == 5))
  9331.                 {// hypercross
  9332.                     d = abs(imag(zT) * real(zT));
  9333.                 }
  9334.                 else if  ((trapshape == 6))
  9335.                 {// cross
  9336.                     d = abs(real(zT));
  9337.                     d2 = abs(imag(zT));
  9338.                     if  ((d2 < d))
  9339.                     {
  9340.                         d = d2;
  9341.                     }
  9342.                 }
  9343.                 else if  ((trapshape == 7))
  9344.                 {// astroid
  9345.                     d = abs(real(zT))^traporder + abs(imag(zT))^traporder;
  9346.                     if  ((traporder < 0))
  9347.                     {
  9348.                         d = 1/d;
  9349.                     }
  9350.                 }
  9351.                 else if  ((trapshape == 8))
  9352.                 {// diamond
  9353.                     d = abs(real(zT)) + abs(imag(zT));
  9354.                 }
  9355.                 else if  ((trapshape == 9))
  9356.                 {// rectangle
  9357.                     d = abs(real(zT));
  9358.                     d2 = abs(imag(zT));
  9359.                     if  ((d2 > d))
  9360.                     {
  9361.                         d = d2;
  9362.                     }
  9363.                 }
  9364.                 else if  ((trapshape == 10))
  9365.                 {// box
  9366.                     d = abs(real(zT));
  9367.                     d2 = abs(imag(zT));
  9368.                     if  ((d2 > d))
  9369.                     {
  9370.                         d = d2;
  9371.                     }
  9372.                     d = abs(d - diameter);
  9373.                 }
  9374.                 else if  ((trapshape == 11))
  9375.                 {// lines
  9376.                     d = abs(abs(imag(zT)) - diameter);
  9377.                 }
  9378.                 else if  ((trapshape == 12))
  9379.                 {// waves
  9380.                     d = abs(abs(imag(zT) + sin(real(zT)*trapfreq)*traporder*0.25) - diameter);
  9381.                 }
  9382.                 else if  ((trapshape == 13))
  9383.                 {// mirrored waves
  9384.                     d = abs(abs(imag(zT)) - diameter + sin(real(zT)*trapfreq)*traporder*0.25);
  9385.                 }
  9386.                 else if  ((trapshape == 14))
  9387.                 {// mirrored waves 2
  9388.                     d2 = diameter - sin(real(zT)*trapfreq)*traporder*0.25;// compute wave height
  9389.                     d  = abs(abs(imag(zT)) - d2);// distance to each wave
  9390.                     d2 = abs(abs(imag(zT)) + d2);
  9391.                     if  ((d2 < d))
  9392.                     {
  9393.                         d = d2;
  9394.                     }
  9395.                 }
  9396.                 else if  ((trapshape == 15))
  9397.                 {// radial waves
  9398.                     d2 = atan2(zT);
  9399.                     d = abs(cabs(zT) * (1 - sin(d2*trapfreq)*traporder*0.125) - diameter);
  9400.                 }
  9401.                 else if  ((trapshape == 16))
  9402.                 {// radial waves 2
  9403.                     d2 = atan2(zT);
  9404.                     d2 = sin(d2*trapfreq)*traporder*0.125;
  9405.                     d = abs(cabs(zT) * (1 - d2) - diameter);
  9406.                     d2 = abs(cabs(zT) * (1 + d2) - diameter);
  9407.                     if  ((d2 < d))
  9408.                     {
  9409.                         d = d2;
  9410.                     }
  9411.                 }
  9412.                 else if  ((trapshape == 17))
  9413.                 {// ring ripples
  9414.                     d = cabs(zT);
  9415.                     if  ((d < traporder))
  9416.                     {
  9417.                         d = cos(d * diameter2 * trapfreq) * sqr(1-d/traporder);
  9418. //        d = (cos(d * diameter2 * @trapfreq)+1) * sqr(1-d/@traporder) * 0.5
  9419.                     }
  9420.                     else
  9421.                     {
  9422.  
  9423.                         d = 0;
  9424.                     }
  9425.                 }
  9426.                 else if  ((trapshape == 18))
  9427.                 {// grid ripples
  9428.                     d = cabs(zT);
  9429.                     if  ((d < traporder))
  9430.                     {
  9431.                         d = (cos(real(zT)*diameter2*trapfreq) + cos(imag(zT)*diameter2*trapfreq)) * sqr(1-d/traporder) * 0.5;
  9432.                     }
  9433.                     else
  9434.                     {
  9435.  
  9436.                         d = 0;
  9437.                     }
  9438.                 }
  9439.                 else if  ((trapshape == 19))
  9440.                 {// radial ripples
  9441.                     d = atan2(zT);
  9442.                     d2 = cabs(zT);
  9443.                     if  ((d2 < traporder))
  9444.                     {
  9445.                         d = cos(4 * d * trapfreq) * sqr(1-d2/traporder);
  9446.                     }
  9447.                     else
  9448.                     {
  9449.  
  9450.                         d = 0;
  9451.                     }
  9452.                 }
  9453.                 else if  ((trapshape == 20))
  9454.                 {// pinch
  9455.                     d2 = atan2(zT);
  9456.                     if  ((d2 < 0))
  9457.                     {
  9458.                         d2 = d2 + 2*pi;
  9459.                     }
  9460.                     d = sqrt(cabs(zT)) / abs(sin(d2*traporder*0.5));
  9461.                 }
  9462.                 else if  ((trapshape == 21))
  9463.                 {// spiral
  9464.                     d = 1/(cabs(zT)) * diameter;
  9465.                     r0 = (0,1) ^ d;
  9466.                     zT = zT * r0;
  9467.                     d = atan(abs(imag(zT)/real(zT)));
  9468.                 }
  9469.                 else if  ((trapshape == 22))
  9470.                 {// heart
  9471.                     zh = real(zT) + flip(abs(imag(zT)));
  9472.                     zh = zh*rh * 3 / diameter;
  9473.                     d = abs(real(zh) - sqr(imag(zh)) + 3);
  9474.                 }
  9475.  
  9476.     // apply trap transfer function
  9477.     // a function is not used because these are floats
  9478.     // and not all functions apply to floats
  9479.                 d = d * prescale;
  9480.                 if  ((trapfunc == 1))
  9481.                 {// log
  9482.                     d = log(d);
  9483.                 }
  9484.                 else if  ((trapfunc == 2))
  9485.                 {// sqrt
  9486.                     d = sqrt(d);
  9487.                 }
  9488.                 else if  ((trapfunc == 3))
  9489.                 {// cuberoot
  9490.                     d = (d)^(1/3);
  9491.                 }
  9492.                 else if  ((trapfunc == 4))
  9493.                 {// exp
  9494.                     d = exp(d);
  9495.                 }
  9496.                 else if  ((trapfunc == 5))
  9497.                 {// sqr
  9498.                     d = sqr(d);
  9499.                 }
  9500.                 else if  ((trapfunc == 6))
  9501.                 {// cube
  9502.                     d = (d)^3;
  9503.                 }
  9504.                 else if  ((trapfunc == 7))
  9505.                 {// sin
  9506.                     d = sin(d);
  9507.                 }
  9508.                 else if  ((trapfunc == 8))
  9509.                 {// cos
  9510.                     d = cos(d);
  9511.                 }
  9512.                 else if  ((trapfunc == 9))
  9513.                 {// tan
  9514.                     d = tan(d);
  9515.                 }
  9516.                 else if  ((trapfunc == 10))
  9517.                 {// sinc (modified form)
  9518.                     if  ((d == 0))
  9519.                     {
  9520.                         d = 1;
  9521.                     }
  9522.                     else
  9523.                     {
  9524.  
  9525.                         d = sin(pi*d)/d;
  9526.                     }
  9527.                 }
  9528.                 d = d * postscale;
  9529.                 if  ((trapabs))
  9530.                 {// absolute value only
  9531.                     d = abs(d);
  9532.                 }
  9533.  
  9534.     // now adjust closest/point/i as needed
  9535.                 if  ((movetrap == false || iter > 1))
  9536.                 {
  9537.                     if  ((traptype == 0))
  9538.                     {// closest
  9539.                         if  ((d < closest))
  9540.                         {
  9541.                             i = iter;
  9542.                             point = zP;
  9543.                             point2 = zT;
  9544.                             closest = d;
  9545.                         }
  9546. //        IF (d < @threshold)
  9547. //          usesolid = false
  9548. //        ENDIF
  9549.                     }
  9550.                     else if  ((traptype == 1))
  9551.                     {// farthest (within threshold)
  9552.                         if  ((d > closest && d < threshold))
  9553.                         {
  9554.                             i = iter;
  9555.                             point = zP;
  9556.                             point2 = zT;
  9557.                             closest = d;
  9558. //          usesolid = false
  9559.                         }
  9560.                     }
  9561.                     else if  ((traptype == 2))
  9562.                     {// first (within threshold)
  9563.                         if  ((d < threshold && done == false))
  9564.                         {
  9565.                             i = iter;
  9566.                             point = zP;
  9567.                             point2 = zT;
  9568.                             closest = d;
  9569.                             done = true;
  9570. //          usesolid = false
  9571.                         }
  9572.                     }
  9573.                     else if  ((traptype == 3))
  9574.                     {// last (within threshold)
  9575.                         if  ((d < threshold))
  9576.                         {
  9577.                             i = iter;
  9578.                             point = zP;
  9579.                             point2 = zT;
  9580.                             closest = d;
  9581.                             done = true;
  9582. //          usesolid = false
  9583.                         }
  9584.                     }
  9585.                     else if  ((traptype == 4))
  9586.                     {// sum (within threshold)
  9587.                         if  ((d < threshold))
  9588.                         {
  9589.                             i = iter;
  9590.                             point = point + zP;
  9591.                             point2 = point2 + zT;
  9592.                             closest = closest + d;
  9593. //          usesolid = false
  9594.                         }
  9595.                     }
  9596.                     else if  ((traptype == 5))
  9597.                     {// average (within threshold)
  9598.                         if  ((d < threshold))
  9599.                         {
  9600.                             i = iter;
  9601.                             i1 = i1 + 1;
  9602.                             point = point + zP;
  9603.                             point2 = point2 + zT;
  9604.                             closest = closest + d;
  9605. //          usesolid = false
  9606.                         }
  9607.                     }
  9608.                     else if  ((traptype == 6))
  9609.                     {// product (within threshold)
  9610.                         if  ((d < threshold))
  9611.                         {
  9612.                             i = iter;
  9613.                             point = point * zP / threshold;
  9614.                             point2 = point2 * zT / threshold;
  9615.                             closest = closest * d / threshold;
  9616. //          usesolid = false
  9617.                         }
  9618.                     }
  9619.                     else if  ((traptype == 7))
  9620.                     {// sign average
  9621.                         if  ((d < d2))
  9622.                         {
  9623.                             i = i + 1;
  9624.                             point = point + zP;
  9625.                             point2 = point2 + zT;
  9626.                             closest = closest + 1;
  9627. //          usesolid = false
  9628.                         }
  9629.                         else
  9630.                         {
  9631.  
  9632.                             i = i - 1;
  9633.                         }
  9634.                         d2 = d;
  9635.                     }
  9636.                     else if  ((traptype == 8 || traptype == 10))
  9637.                     {// second/two closest
  9638.                         if  ((d < closest))
  9639.                         {
  9640.                             i1 = i;
  9641.                             point1 = point;
  9642.                             point3 = point2;
  9643.                             closest1 = closest;
  9644.                             i = iter;
  9645.                             point = zP;
  9646.                             point2 = zT;
  9647.                             closest = d;
  9648.                         }
  9649.                         else if  ((d < closest1))
  9650.                         {
  9651.                             i1 = iter;
  9652.                             point1 = zP;
  9653.                             point3 = zT;
  9654.                             closest1 = d;
  9655.                         }
  9656. //        IF (d < @threshold)
  9657. //          usesolid = false
  9658. //        ENDIF
  9659.                     }
  9660.                     else if  ((traptype == 9 || traptype == 11))
  9661.                     {// second/two farthest
  9662.                         if  ((d > closest && d < threshold))
  9663.                         {
  9664.                             i1 = i;
  9665.                             point1 = point;
  9666.                             point3 = point2;
  9667.                             closest1 = closest;
  9668.                             i = iter;
  9669.                             point = zP;
  9670.                             point2 = zT;
  9671.                             closest = d;
  9672. //          usesolid = false
  9673.                         }
  9674.                         else if  ((d > closest1 && d < threshold))
  9675.                         {
  9676.                             i1 = iter;
  9677.                             point1 = zP;
  9678.                             point3 = zT;
  9679.                             closest1 = d;
  9680. //          usesolid = false
  9681.                         }
  9682.                     }
  9683.                     else if  ((traptype == 12))
  9684.                     {// funky average
  9685.                         if  ((d < threshold))
  9686.                         {
  9687.                             i = i + 1;
  9688.                             point = zP - point;
  9689.                             point2 = zT - point2;
  9690.                             closest = threshold - abs(closest - d);
  9691. //          usesolid = false
  9692.                         }
  9693.                     }
  9694.                     else if  ((traptype == 13))
  9695.                     {// funky average 2
  9696.                         if  ((d < threshold))
  9697.                         {
  9698.                             i = i + 1;
  9699.                             point = zP - point;
  9700.                             point2 = zT - point2;
  9701.                             closest = abs(d - threshold + closest);
  9702. //          usesolid = false
  9703.                         }
  9704.                     }
  9705.                     else if  ((traptype == 14))
  9706.                     {// funky average 3 (Luke Plant)
  9707.                         if  ((d < threshold))
  9708.                         {
  9709.                             i = i + 1;
  9710.                             d2 = d/threshold;
  9711.                             point = zP + (point-zP) * d2;
  9712.                             point2 = zT + (point2-zT) * d2;
  9713.                             closest = closest + d;
  9714. //          usesolid = false
  9715.                         }
  9716.                     }
  9717.                     else if  ((traptype == 15))
  9718.                     {// funky average 4 (exponential average)
  9719.                         if  ((d < threshold))
  9720.                         {
  9721.                             i = i + 1;
  9722.                             point = zP - point;
  9723.                             point2 = zT - point2;
  9724.                             closest = closest + exp(-d);
  9725. //          usesolid = false
  9726.                         }
  9727.                     }
  9728.                     else if  ((traptype == 16))
  9729.                     {// funky average 5 (average distance change)
  9730.                         if  ((d < d2))
  9731.                         {
  9732.                             point = point + zP;
  9733.                             point2 = point2 + zT;
  9734.                             closest = closest + d2-d;
  9735. //          usesolid = false
  9736.                         }
  9737.                         d2 = d;
  9738.                     }
  9739.                     else if  ((traptype == 17))
  9740.                     {// funky average 6 (Luke Plant, 1/squared)
  9741.                         if  ((d < threshold))
  9742.                         {
  9743.                             i = i + 1;
  9744. //          usesolid = false
  9745.                         }
  9746.                         d2 = sqr(d/threshold);
  9747.                         point = zP + (point-zP) * d2;
  9748.                         point2 = zT + (point2-zT) * d2;
  9749.                         closest = closest + 1/d2;
  9750.                     }
  9751.                     else if  ((traptype == 18))
  9752.                     {// trap only, do first iteration
  9753.                         if  ((iter == 1))
  9754.                         {
  9755.                             point = zP;
  9756.                             point2 = zT;
  9757.                             closest = d/threshold;
  9758. //          IF (d < @threshold)
  9759. //            usesolid = false
  9760. //          ENDIF
  9761.                         }
  9762.                     }
  9763.                 }
  9764.  
  9765.                 if  ((j == 0))
  9766.                 {
  9767.                     z1closest = closest;
  9768.                     z1closest1 = closest1;
  9769.                     z1i = i;
  9770.                     z1i1 = i1;
  9771.                     z1point = point;
  9772.                     z1point1 = point1;
  9773.                     z1point2 = point2;
  9774.                     z1point3 = point3;
  9775.                 }
  9776.                 else if  ((j == 1))
  9777.                 {
  9778.                     z2closest = closest;
  9779.                     z2closest1 = closest1;
  9780.                     z2i = i;
  9781.                     z2i1 = i1;
  9782.                     z2point = point;
  9783.                     z2point1 = point1;
  9784.                     z2point2 = point2;
  9785.                     z2point3 = point3;
  9786.                 }
  9787.                 else
  9788.                 {
  9789.  
  9790.                     z3closest = closest;
  9791.                     z3closest1 = closest1;
  9792.                     z3i = i;
  9793.                     z3i1 = i1;
  9794.                     z3point = point;
  9795.                     z3point1 = point1;
  9796.                     z3point2 = point2;
  9797.                     z3point3 = point3;
  9798.                 }
  9799.                 j = j + 1;
  9800.             }
  9801.  
  9802.         }
  9803.  
  9804.   // determine surface normal if necessary
  9805.         modz = |z1|;
  9806.         if  ((modz > bailout ||everyiter ||iter == maxit))
  9807.         {// done, or every iteration, or last
  9808.     // determine (height) for each point (final calculations)
  9809.  
  9810.             j = 0;
  9811.             while  ((j < 3))
  9812.             {
  9813.                 if  ((j == 0))
  9814.                 {
  9815.                     zP = z1;
  9816.                     cT = pixel;
  9817.                     closest = z1closest;
  9818.                     closest1 = z1closest1;
  9819.                     i = z1i;
  9820.                     i1 = z1i1;
  9821.                     point = z1point;
  9822.                     point1 = z1point1;
  9823.                     point2 = z1point2;
  9824.                     point3 = z1point3;
  9825.                 }
  9826.                 else if  ((j == 1))
  9827.                 {
  9828.                     zP = z2;
  9829.                     cT = pixel + offset;
  9830.                     closest = z2closest;
  9831.                     closest1 = z2closest1;
  9832.                     i = z2i;
  9833.                     i1 = z2i1;
  9834.                     point = z2point;
  9835.                     point1 = z2point1;
  9836.                     point2 = z2point2;
  9837.                     point3 = z2point3;
  9838.                 }
  9839.                 else
  9840.                 {
  9841.  
  9842.                     zP = z3;
  9843.                     cT = pixel + flip(offset);
  9844.                     closest = z3closest;
  9845.                     closest1 = z3closest1;
  9846.                     i = z3i;
  9847.                     i1 = z3i1;
  9848.                     point = z3point;
  9849.                     point1 = z3point1;
  9850.                     point2 = z3point2;
  9851.                     point3 = z3point3;
  9852.                 }
  9853.  
  9854.                 if  ((traptype == 5))
  9855.                 {// traptype average
  9856.                     point = point / i1;
  9857.                     point2 = point2 / i1;
  9858.                     closest = closest / i1;
  9859.                 }
  9860.                 else if  ((traptype == 6))
  9861.                 {// traptype product
  9862.                     closest = abs(closest);
  9863.                 }
  9864.                 else if  ((traptype == 7))
  9865.                 {// traptype sign average
  9866.                     point = point / iter;
  9867.                     point2 = point2 / iter;
  9868.                     closest = closest / iter;
  9869.                 }
  9870.                 else if  ((traptype == 8 || traptype == 9))
  9871.                 {// second closest or farthest
  9872.                     i = i - i1;
  9873.                     point = point - point1;
  9874.                     point2 = point2 - point3;
  9875.                     closest = closest - closest1;
  9876.                 }
  9877.                 else if  ((traptype == 10 || traptype == 11))
  9878.                 {// two closest or farthest
  9879.                     i = round((i + i1) / 2);
  9880.                     point = (point + point1) / 2;
  9881.                     point2 = (point2 + point3) / 2;
  9882.                     closest = (closest + closest1) / 2;
  9883.                 }
  9884.                 else if  ((traptype == 14))
  9885.                 {// funky average 3
  9886.                     closest = threshold * i - closest;
  9887.                 }
  9888.  
  9889.     // choose coloring based on method
  9890. //    IF (!@solidcolor); solid color not allowed
  9891. //      #solid = false
  9892. //    ELSE
  9893. //      #solid = usesolid
  9894. //    ENDIF
  9895.                 if  ((trapcolor == 0))
  9896.                 {// distance
  9897.                     if  ((traptype == 2 || traptype == 3))
  9898.                     {// first or last type
  9899.                         d = closest / threshold;
  9900.                     }
  9901.                     else
  9902.                     {
  9903. // any other trap type
  9904.                         d = closest;
  9905.                     }
  9906.                 }
  9907.                 else if  ((trapcolor == 1))
  9908.                 {// magnitude
  9909.                     d = cabs(point2);
  9910.                 }
  9911.                 else if  ((trapcolor == 2))
  9912.                 {// real
  9913.                     d = abs(real(point2));
  9914.                 }
  9915.                 else if  ((trapcolor == 3))
  9916.                 {// imaginary
  9917.                     d = abs(imag(point2));
  9918.                 }
  9919.                 else if  ((trapcolor == 4))
  9920.                 {// angle to trap
  9921.                     d = atan2(point2);
  9922.                     if  ((d < 0))
  9923.                     {
  9924.                         d = d + pi * 2;
  9925.                     }
  9926.                     d = d / (pi * 2);
  9927.                 }
  9928.                 else if  ((trapcolor == 5))
  9929.                 {// angle to trap 2 (no aspect)
  9930.                     point = point - trapcenter;
  9931.                     d = atan2(point);
  9932.                     if  ((d < 0))
  9933.                     {
  9934.                         d = d + pi * 2;
  9935.                     }
  9936.                     d = d / (pi * 2);
  9937.                 }
  9938.                 else if  ((trapcolor == 6))
  9939.                 {// angle to origin
  9940.                     d = atan2(point);
  9941.                     if  ((d < 0))
  9942.                     {
  9943.                         d = d + pi * 2;
  9944.                     }
  9945.                     d = d / (pi * 2);
  9946.                 }
  9947.                 else if  ((trapcolor == 7))
  9948.                 {// angle to origin 2 (old ReallyCool)
  9949.                     d = 0.02 * abs(atan(imag(point) / real(point)) * 180/pi);
  9950.                 }
  9951.                 else if  ((trapcolor == 8))
  9952.                 {// iteration
  9953.                     d = i;
  9954.                     d = d / maxiter;
  9955.                 }
  9956.  
  9957.                 if  ((j == 0))
  9958.                 {
  9959.                     e1 = d;
  9960.                 }
  9961.                 else if  ((j == 1))
  9962.                 {
  9963.                     e2 = d;
  9964.                 }
  9965.                 else
  9966.                 {
  9967.  
  9968.                     e3 = d;
  9969.                 }
  9970.                 j = j + 1;
  9971.             }
  9972.  
  9973.     // apply pre-scale
  9974.             e1 = e1 * zscale;
  9975.             e2 = e2 * zscale;
  9976.             e3 = e3 * zscale;
  9977.  
  9978.     // apply transfer function
  9979.     // a function is not used because these are floats
  9980.     // and not all functions apply to floats
  9981.             if  ((xfer == 1))
  9982.             {// log
  9983.                 e1 = log(e1);
  9984.                 e2 = log(e2);
  9985.                 e3 = log(e3);
  9986.             }
  9987.             else if  ((xfer == 2))
  9988.             {// sqrt
  9989.                 e1 = sqrt(e1);
  9990.                 e2 = sqrt(e2);
  9991.                 e3 = sqrt(e3);
  9992.             }
  9993.             else if  ((xfer == 3))
  9994.             {// cuberoot
  9995.                 e1 = (e1)^(1/3);
  9996.                 e2 = (e2)^(1/3);
  9997.                 e3 = (e3)^(1/3);
  9998.             }
  9999.             else if  ((xfer == 4))
  10000.             {// exp
  10001.                 e1 = exp(e1);
  10002.                 e2 = exp(e2);
  10003.                 e3 = exp(e3);
  10004.             }
  10005.             else if  ((xfer == 5))
  10006.             {// sqr
  10007.                 e1 = sqr(e1);
  10008.                 e2 = sqr(e2);
  10009.                 e3 = sqr(e3);
  10010.             }
  10011.             else if  ((xfer == 6))
  10012.             {// cube
  10013.                 e1 = (e1)^3;
  10014.                 e2 = (e2)^3;
  10015.                 e3 = (e3)^3;
  10016.             }
  10017.             else if  ((xfer == 7))
  10018.             {// sin
  10019.                 e1 = sin(e1);
  10020.                 e2 = sin(e2);
  10021.                 e3 = sin(e3);
  10022.             }
  10023.             else if  ((xfer == 8))
  10024.             {// cos
  10025.                 e1 = cos(e1);
  10026.                 e2 = cos(e2);
  10027.                 e3 = cos(e3);
  10028.             }
  10029.             else if  ((xfer == 9))
  10030.             {// tan
  10031.                 e1 = tan(e1);
  10032.                 e2 = tan(e2);
  10033.                 e3 = tan(e3);
  10034.             }
  10035.  
  10036.     // apply post-scale
  10037.             e1 = e1 * zscale2;
  10038.             e2 = e2 * zscale2;
  10039.             e3 = e3 * zscale2;
  10040.  
  10041.     // determine surface normal
  10042.     // that is, the normal to the surface defined by:
  10043.     // (real(c1), imag(c1), e1)
  10044.     // (real(c2), imag(c2), e2)
  10045.     // (real(c3), imag(c3), e3)
  10046.             vx = e2-e1;
  10047.             vy = e3-e1;
  10048.             vz = -offset;
  10049.     // normalize vector
  10050.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  10051.             vx = vx*vd;
  10052.             vy = vy*vd;
  10053.             vz = vz*vd;
  10054.             z = vx + flip(vy);// fudge z from vector
  10055.         }
  10056.         else
  10057.         {
  10058. // didn't compute z this time
  10059.             z = z1;// use primary iteration value to keep periodicity working
  10060.         }
  10061.         if  ((modz > bailout))
  10062.         {// we're done
  10063.             iter = -1;
  10064.         }
  10065.   
  10066.     }
  10067.     bool bailout(void)
  10068.     {
  10069.         return(iter > 0);
  10070.   
  10071.     }
  10072.     void description(void)
  10073.     {
  10074.         this.title = "SlopeTrap (Mandelbrot)";
  10075.         this.helpfile = "dmj-pub\dmj-pub-uf-st.htm";
  10076.         this.center = (-0.5, 0.0);
  10077.         this.maxiter = 1000;
  10078.  
  10079.    
  10080.         start.caption = "Starting Point";
  10081.         start.default = (0,0);
  10082.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  10083.   
  10084.    
  10085.         power.caption = "Exponent";
  10086.         power.default = (2,0);
  10087.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  10088.   
  10089.    
  10090.         bailout.caption = "Bail-out Value";
  10091.         bailout.default = 1.0e20;
  10092.         bailout.min = 0.0;
  10093.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  10094.   
  10095.  
  10096.    
  10097.         trapshape.caption = "Trap Shape";
  10098.         trapshape.default = 0;
  10099.         trapshape.enum = "point\nring\nring 2\negg\nhyperbola\nhypercross\ncross\nastroid\ndiamond\nrectangle\nbox\nlines\nwaves\nmirrored waves\nmirrored waves 2\nradial waves\nradial waves 2\nring ripples\ngrid ripples\nradial ripples\npinch\nspiral\nheart";
  10100.         trapshape.hint = "This is the shape of the orbit trap.";
  10101.   
  10102.    
  10103.         trapcolor.caption = "Trap Coloring";
  10104.         trapcolor.default = 0;
  10105.         trapcolor.enum = "distance\nmagnitude\nreal\nimaginary\nangle to trap\nangle to trap 2\nangle to origin\nangle to origin 2\niteration";
  10106.         trapcolor.hint = "This is the information used to produce a color.";
  10107.   
  10108.    
  10109.         traptype.caption = "Trap Mode";
  10110.         traptype.default = 0;
  10111.         traptype.enum = "closest\nfarthest\nfirst\nlast\nsum\naverage\nproduct\nsign average\nsecond closest\nsecond farthest\ntwo closest\ntwo farthest\nfunky average\nfunky average 2\nfunky average 3\nfunky average 4\nfunky average 5\nfunky average 6\ntrap only";
  10112.         traptype.hint = "This is how points will be chosen to use for coloring.";
  10113.   
  10114.    
  10115.         traporder.caption = "Trap Order";
  10116.         traporder.default = 4.0;
  10117.         traporder.hint = "Number of leaves for the pinch trap shape, the exponent to use for astroid curves (try 0.66667), 'egginess', or the height of waves.";
  10118.   
  10119.    
  10120.         trapfreq.caption = "Trap Frequency";
  10121.         trapfreq.default = 1.0;
  10122.         trapfreq.hint = "The frequency of ripples or waves.";
  10123.   
  10124.    
  10125.         trapcenter.caption = "Trap Center";
  10126.         trapcenter.default = (0,0);
  10127.         trapcenter.hint = "This is the location of the trap in the complex plane.";
  10128.   
  10129.    
  10130.         trapdrift.caption = "Trap Drift";
  10131.         trapdrift.default = (0,0);
  10132.         trapdrift.hint = "This is the amount the trap center will move with each iteration.";
  10133.   
  10134.    
  10135.         traporbit.caption = "Trap Orbit";
  10136.         traporbit.default = (0,0);
  10137.         traporbit.hint = "The trap center location is multiplied by this value with each iteration.";
  10138.   
  10139.    
  10140.         movetrap.caption = "Trap Center Moves";
  10141.         movetrap.default = false;
  10142.         movetrap.hint = "If this is enabled, the trap center will match the pixel location instead of being fixed.  This overrides Trap Center.";
  10143.   
  10144.    
  10145.         aspect.caption = "Aspect Ratio";
  10146.         aspect.default = 1.0;
  10147.         aspect.min = 0.0000000001;
  10148.         aspect.hint = "This is how square the trap is.  You can distort the trap by using a value other than 1.0.";
  10149.   
  10150.    
  10151.         threshold.caption = "Threshold";
  10152.         threshold.default = 0.25;
  10153.         threshold.min = 0;
  10154.         threshold.hint = "This is the width of the trap area, used for most trap modes.";
  10155.   
  10156.    
  10157.         diameter.caption = "Diameter";
  10158.         diameter.default = 1.0;
  10159. //    min = 0
  10160.         diameter.hint = "This is the diameter of the trap (for ring, box, and line shapes).";
  10161.   
  10162.    
  10163.         Parm_angle.caption = "Rotation";
  10164.         Parm_angle.default = 0.0;
  10165.         Parm_angle.hint = "This is the angle, in degrees, that the trap should be rotated.";
  10166.   
  10167.    
  10168.         anglestep.caption = "Rotation Step";
  10169.         anglestep.default = 0.0;
  10170.         anglestep.hint = "This is the angle, in degrees, that the trap will be rotated with each iteration.";
  10171.   
  10172.    
  10173.         skew.caption = "Skew";
  10174.         skew.default = 0.0;
  10175.         skew.hint = "This is the angle, in degrees, to skew the vertical axis of the trap shape.";
  10176.   
  10177.    
  10178.         skewstep.caption = "Skew Step";
  10179.         skewstep.default = 0.0;
  10180.         skewstep.hint = "This is the angle, in degrees, that the skew angle should be increased by with each iteration.";
  10181.   
  10182.    
  10183.         trapfunc.caption = "Distance Transfer";
  10184.         trapfunc.default = 0;
  10185.         trapfunc.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan\nsinc";
  10186.         trapfunc.hint = "This function is applied to trap distances at every iteration. It can be used to apply some special effects to trap shapes.";
  10187.   
  10188.    
  10189.         prescale.caption = "Distance Pre-scale";
  10190.         prescale.default = 1.0;
  10191.         prescale.hint = "This is a multiplier applied to the trap distance, before the Distance Transfer function is applied to it.";
  10192.   
  10193.    
  10194.         postscale.caption = "Distance Post-scale";
  10195.         postscale.default = 1.0;
  10196.         postscale.hint = "This is a multiplier applied to the trap distance, after the Distance Transfer function is applied to it.";
  10197.   
  10198.    
  10199.         trapabs.caption = "No Negative Distance";
  10200.         trapabs.default = false;
  10201.         trapabs.hint = "If enabled, eliminates 'negative' distances by taking the absolute value of the distance.";
  10202.   
  10203.    
  10204.         trapstart.caption = "Start Iteration";
  10205.         trapstart.default = 0.0;
  10206.         trapstart.hint = "This is the iteration at which to start watching for orbit traps.";
  10207.   
  10208.    
  10209.         trapiter.caption = "Trap Iterations";
  10210.         trapiter.default = 10000.0;
  10211.         trapiter.hint = "This is the number of iterations to watch for traps in a single block.";
  10212.   
  10213.    
  10214.         trapskip.caption = "Skip Iterations";
  10215.         trapskip.default = 0.0;
  10216.         trapskip.hint = "This is the number of iterations to skip watching for traps, after a block of watched iterations.";
  10217.   
  10218.    
  10219.         gauss.caption = "Repeat Spacing";
  10220.         gauss.default = 0.0;
  10221.         gauss.min = 0.0;
  10222.         gauss.hint = "This is the spacing at which the trap will repeat, all across the complex plane.  If zero, trap does not repeat.";
  10223.   
  10224.    
  10225.         gaussgcenter.caption = "Repeat Center";
  10226.         gaussgcenter.default = (0,0);
  10227.         gaussgcenter.hint = "This is the center point of grid trap repetition.";
  10228.   
  10229.    
  10230.         gaussr.caption = "Radial Spacing";
  10231.         gaussr.default = 0.0;
  10232.         gaussr.min = 0;
  10233.         gaussr.hint = "This is the number of times the trap will repeat, radially around the radial center point.  If zero, trap does not repeat radially.";
  10234.   
  10235.    
  10236.         gausss.caption = "Concentric Spacing";
  10237.         gausss.default = 0.0;
  10238.         gausss.min = 0;
  10239.         gausss.hint = "This is the distance at which the trap will repeat, radially out from the radial center point.  If zero, trap does not repeat radially out.";
  10240.   
  10241.    
  10242.         gausscenter.caption = "Radial Center";
  10243.         gausscenter.default = (0,0);
  10244.         gausscenter.hint = "This is the center point of radial trap repetition.";
  10245.   
  10246.    
  10247.         radialmode.caption = "Radial Mode";
  10248.         radialmode.default = 0;
  10249.         radialmode.enum = "kaleidoscope\npolar coordinates";
  10250.         radialmode.hint = "Indicates the type of radial repetition to use.  The two styles produce very different results.";
  10251.   
  10252.  
  10253.    
  10254.         offset.caption = "Orbit Separation";
  10255.         offset.default = 0.00000001;
  10256.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  10257.   
  10258.    
  10259.         xfer.caption = "Height Transfer";
  10260.         xfer.default = 0;
  10261.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  10262.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  10263.   
  10264.    
  10265.         zscale.caption = "Height Pre-Scale";
  10266.         zscale.default = 1.0;
  10267.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  10268.   
  10269.    
  10270.         zscale2.caption = "Height Post-Scale";
  10271.         zscale2.default = 0.025;
  10272.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  10273.   
  10274.    
  10275.         everyiter.caption = "Every Iteration";
  10276.         everyiter.default = false;
  10277.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  10278.   
  10279.  
  10280.     }
  10281. }
  10282.  
  10283.  
  10284. dmj-Slope2Julia {
  10285. //
  10286. // This is the Julia set, but the calculations
  10287. // are modified so that z contains a surface normal
  10288. // to the set instead of the orbit value.  This is
  10289. // intended primarily for the Lighting coloring
  10290. // method, but might have interesting results for
  10291. // other methods, too.
  10292. //
  10293. complex z1;
  10294. complex z2;
  10295. parameter real offset;
  10296. complex z3;
  10297. real modz;
  10298. real e1;
  10299. real e2;
  10300. real e3;
  10301. real vx;
  10302. real vy;
  10303. real vz;
  10304. real vd;
  10305. int j;
  10306. real closest;
  10307. complex e38;
  10308. real closest1;
  10309. real d;
  10310. real d2;
  10311. complex point;
  10312. complex point1;
  10313. complex point2;
  10314. complex point3;
  10315. complex zT;
  10316. complex zP;
  10317. complex cT;
  10318. bool done;
  10319. int i;
  10320. int i1;
  10321. int iter;
  10322. real fiter;
  10323. parameter real trapstart;
  10324. bool trapping;
  10325. real diameter2;
  10326. parameter real diameter;
  10327. real r1;
  10328. parameter real Parm_angle;
  10329. real r2;
  10330. parameter real anglestep;
  10331. real s1;
  10332. parameter real skew;
  10333. real s2;
  10334. parameter real skewstep;
  10335. complex r;
  10336. complex r0;
  10337. complex s;
  10338. complex rh;
  10339. parameter real traporder;
  10340. complex zh;
  10341. complex trapcenter2;
  10342. parameter complex trapcenter;
  10343. parameter bool movetrap;
  10344. parameter int trapshape;
  10345. parameter int traptype;
  10346. int z1i;
  10347. int z2i;
  10348. int z3i;
  10349. int z1i1;
  10350. int z2i1;
  10351. int z3i1;
  10352. real z1closest;
  10353. real z2closest;
  10354. real z3closest;
  10355. real z1closest1;
  10356. real z2closest1;
  10357. real z3closest1;
  10358. complex z1point;
  10359. complex z2point;
  10360. complex z3point;
  10361. complex z1point1;
  10362. complex z2point1;
  10363. complex z3point1;
  10364. complex z1point2;
  10365. complex z2point2;
  10366. complex z3point2;
  10367. complex z1point3;
  10368. complex z2point3;
  10369. complex z3point3;
  10370. parameter complex power;
  10371. parameter complex seed;
  10372. parameter real trapskip;
  10373. parameter real trapiter;
  10374. parameter complex trapdrift;
  10375. parameter complex traporbit;
  10376. parameter real gausss;
  10377. parameter real gaussr;
  10378. parameter complex gausscenter;
  10379. parameter int radialmode;
  10380. parameter real gauss;
  10381. parameter complex gaussgcenter;
  10382. parameter real aspect;
  10383. parameter real trapfreq;
  10384. parameter real prescale;
  10385. parameter int trapfunc;
  10386. parameter real postscale;
  10387. parameter bool trapabs;
  10388. parameter real threshold;
  10389. parameter real bailout;
  10390. parameter bool everyiter;
  10391. parameter int trapcolor;
  10392. parameter real zscale;
  10393. parameter int xfer;
  10394. parameter real zscale2;
  10395.  
  10396.     void init(void)
  10397.     {
  10398.         z1 = pixel;// primary iterated point
  10399.         z2 = pixel + offset;// horizontally offset point
  10400.         z3 = pixel + flip(offset);// vertically offset point
  10401.         modz = 0.0;
  10402. //  float il2 = 1/log(real(@power)); Inverse log 2 (precalc).
  10403. //  float lp = log(log(@bailout)); log(log bailout) (precalc).
  10404.         e1 = 0.0;// heights
  10405.         e2 = 0.0;
  10406.         e3 = 0.0;
  10407.         vx = 0.0;// normal vector
  10408.         vy = 0.0;
  10409.         vz = 0.0;
  10410.         vd = 0.0;
  10411.         j = 0;
  10412.  
  10413.   // trap variables
  10414.         closest = 1e38;
  10415.         closest1 = 1e38;
  10416.         d = 0.0;
  10417.         d2 = 0.0;
  10418.         point = (0,0);
  10419.         point1 = (0,0);
  10420.         point2 = (0,0);
  10421.         point3 = (0,0);
  10422.         zT = (0,0);
  10423.         zP = (0,0);
  10424.         cT = (0,0);
  10425.         done = false;
  10426.         i = 0;
  10427.         i1 = 0;
  10428.         iter = 0;
  10429.         fiter = trapstart;
  10430.         trapping = false;
  10431.         diameter2 = sqr(diameter);
  10432.         r1 = Parm_angle / 90.0;
  10433.         r2 = anglestep / 90.0;
  10434.         s1 = skew / 90.0;
  10435.         s2 = skewstep / 90.0;
  10436.         r = (0,1) ^ r1;
  10437.         r0 = (0,0);
  10438.         s = (0,1) ^ s1;
  10439.         rh = (0,1) ^ (traporder / 8);// heart rotation value
  10440.         zh = (0,0);
  10441.         trapcenter2 = trapcenter;
  10442.  
  10443.         if  ((movetrap))
  10444.         {// Trap Center follows pixel
  10445.             trapcenter2 = pixel + trapcenter;
  10446.         }
  10447.  
  10448.         if  ((trapshape >= 17 || trapshape <= 19))
  10449.         {// ripple shapes
  10450.             diameter2 = pi / diameter;
  10451.         }
  10452.  
  10453.         if  ((traptype == 1 || traptype == 4 || traptype == 5 || traptype == 7 || traptype == 12 || traptype == 13 || traptype == 14 || traptype == 15 || traptype == 16 || traptype == 17 || traptype == 18))
  10454.         {// last, sum, average, sign average
  10455.             closest = 0.0;
  10456.         }
  10457.         else if  ((traptype == 6))
  10458.         {// product
  10459.             closest = 1.0;
  10460.         }
  10461.         else if  ((traptype == 9 || traptype == 11))
  10462.         {// second/two farthest
  10463.             closest = 0.0;
  10464.             closest1 = 0.0;
  10465.         }
  10466. //  BOOL usesolid = true
  10467.   
  10468.   // extra copies of trap state variables
  10469.         z1i = 0;
  10470.         z2i = 0;
  10471.         z3i = 0;
  10472.         z1i1 = 0;
  10473.         z2i1 = 0;
  10474.         z3i1 = 0;
  10475.         z1closest = closest;
  10476.         z2closest = closest;
  10477.         z3closest = closest;
  10478.         z1closest1 = closest1;
  10479.         z2closest1 = closest1;
  10480.         z3closest1 = closest1;
  10481.         z1point = 0;
  10482.         z2point = 0;
  10483.         z3point = 0;
  10484.         z1point1 = 0;
  10485.         z2point1 = 0;
  10486.         z3point1 = 0;
  10487.         z1point2 = 0;
  10488.         z2point2 = 0;
  10489.         z3point2 = 0;
  10490.         z1point3 = 0;
  10491.         z2point3 = 0;
  10492.         z3point3 = 0;
  10493.   
  10494.     }
  10495.     void loop(void)
  10496.     {
  10497.         z1 = z1^power + seed;// iterate each point
  10498.         z2 = z2^power + seed;
  10499.         z3 = z3^power + seed;
  10500.  
  10501.   // update height value as necessary
  10502.  
  10503.         iter = iter + 1;// iteration counter
  10504.         if  ((trapskip != 0))
  10505.         {// we are skipping some iterations
  10506.             fiter = fiter - 1;// one less to go before we trap
  10507.             while  ((fiter < 0.0))
  10508.             {// iterations all used up
  10509.                 if  ((trapping))
  10510.                 {// we are currently trapping
  10511.                     trapping = false;// so stop
  10512.                     fiter = fiter + trapskip;// skip this many iterations
  10513.                 }
  10514.                 else
  10515.                 {
  10516. // we aren't currently trapping
  10517.                     trapping = true;// so start
  10518.                     fiter = fiter + trapiter;// do this many iterations
  10519.                 }
  10520.             }
  10521.         }
  10522.  
  10523.         if  ((trapskip == 0.0 || trapping))
  10524.         {// if we're checking for traps...
  10525.  
  10526.     // adjust rotation/skew/trapcenter
  10527.             if  ((anglestep != 0))
  10528.             {// changing rotation angle.
  10529.                 r = (0,1) ^ (r1+r2*(iter-1));
  10530.             }
  10531.             if  ((skewstep != 0))
  10532.             {// changing skew angle.
  10533.                 s = (0,1) ^ (s1+s2*(iter-1));
  10534.             }
  10535.             if  ((trapdrift != (0,0)))
  10536.             {// changing trap center
  10537.                 trapcenter2 = trapcenter2 + trapdrift;
  10538.             }
  10539.             if  ((traporbit != (0,0)))
  10540.             {// changing trap orbit
  10541.                 trapcenter2 = trapcenter2 * traporbit;
  10542.             }
  10543.  
  10544.             j = 0;
  10545.             while  ((j < 3))
  10546.             {
  10547.                 if  ((j == 0))
  10548.                 {
  10549.                     zP = z1;
  10550.                     cT = pixel;
  10551.                     closest = z1closest;
  10552.                     closest1 = z1closest1;
  10553.                     i = z1i;
  10554.                     i1 = z1i1;
  10555.                     point = z1point;
  10556.                     point1 = z1point1;
  10557.                     point2 = z1point2;
  10558.                     point3 = z1point3;
  10559.                 }
  10560.                 else if  ((j == 1))
  10561.                 {
  10562.                     zP = z2;
  10563.                     cT = pixel + offset;
  10564.                     closest = z2closest;
  10565.                     closest1 = z2closest1;
  10566.                     i = z2i;
  10567.                     i1 = z2i1;
  10568.                     point = z2point;
  10569.                     point1 = z2point1;
  10570.                     point2 = z2point2;
  10571.                     point3 = z2point3;
  10572.                 }
  10573.                 else
  10574.                 {
  10575.  
  10576.                     zP = z3;
  10577.                     cT = pixel + flip(offset);
  10578.                     closest = z3closest;
  10579.                     closest1 = z3closest1;
  10580.                     i = z3i;
  10581.                     i1 = z3i1;
  10582.                     point = z3point;
  10583.                     point1 = z3point1;
  10584.                     point2 = z3point2;
  10585.                     point3 = z3point3;
  10586.                 }
  10587.  
  10588.     // rotate/squash/skew/repeat z
  10589.                 if  ((traptype == 18))
  10590.                 {// trap only, work on unadulterated pixel
  10591.                     zT = cT;
  10592.                 }
  10593.                 else
  10594.                 {
  10595. // some other trap mode, use z
  10596.                     zT = zP;
  10597.                 }
  10598.     // 1. radially repeat
  10599.                 if  ((gausss > 0 && gaussr == 0))
  10600.                 {// concentrically repeating trap, but not radial
  10601.                     zT = zT - gausscenter;
  10602.                     d = cabs(zT);
  10603.                     d = ((d / gausss) - round(d / gausss)) * gausss;
  10604.                     zT = zT * d / cabs(zT) + gausscenter;
  10605.                 }
  10606.                 if  ((gaussr > 0.0))
  10607.                 {// radially repeating trap
  10608.                     zT = zT - gausscenter;
  10609.                     d = cabs(zT);
  10610.                     d2 = atan(imag(zT)/real(zT));
  10611.                     if  ((real(zT) < 0))
  10612.                     {
  10613.                         d2 = d2 + pi;
  10614.                     }
  10615.                     if  ((d2 < 0))
  10616.                     {
  10617.                         d2 = d2 + 2*pi;
  10618.                     }
  10619.                     d2 = d2 / (pi*2);
  10620.                     d2 = ((d2 * gaussr) - round(d2 * gaussr)) / gaussr * pi*2;
  10621.                     if  ((gausss > 0))
  10622.                     {// concentrically repeating trap
  10623.                         d = ((d / gausss) - round(d / gausss)) * gausss;
  10624.                     }
  10625.                     if  ((radialmode == 0))
  10626.                     {// standard radial repeat mode
  10627.                         zT = cos(d2)*d + flip(sin(d2)*d) + gausscenter;
  10628.                     }
  10629.                     else if  ((radialmode == 1))
  10630.                     {// unwrap mode
  10631.                         zT = d + flip(d2);
  10632.                     }
  10633.                 }
  10634.     // 2. grid repeat
  10635.                 if  ((gauss > 0))
  10636.                 {// repeating trap
  10637.                     zT = zT - gaussgcenter;
  10638.                     zT = ((zT / gauss) - round(zT / gauss)) * gauss;
  10639.                     zT = zT + gaussgcenter;
  10640.                 }
  10641.     // 3. rotate
  10642.                 zT = (zT - trapcenter2) * r;// rotate
  10643.     // 4. apply aspect
  10644.                 if  ((aspect != 1.0))
  10645.                 {
  10646.                     zT = real(zT) + flip(imag(zT) * aspect);// apply aspect
  10647.                 }
  10648.     // 5. skew
  10649.                 zT = real(zT * s) + flip(imag(zT));// apply skew
  10650.  
  10651.     // determine distance from trap--different for each shape
  10652.                 if  ((trapshape == 0))
  10653.                 {// point
  10654.                     d = cabs(zT);
  10655.                 }
  10656.                 else if  ((trapshape == 1))
  10657.                 {// ring
  10658.                     d = abs(cabs(zT) - diameter);
  10659.                 }
  10660.                 else if  ((trapshape == 2))
  10661.                 {// ring2
  10662.                     d = abs(|zT| - diameter2);
  10663.                 }
  10664.                 else if  ((trapshape == 3))
  10665.                 {// egg
  10666.                     d = (cabs(zT-flip(diameter)*2) + cabs(zT)*traporder*0.5) * 0.25;
  10667.                 }
  10668.                 else if  ((trapshape == 4))
  10669.                 {// hyperbola
  10670.                     d = abs(imag(zT) * real(zT) - diameter);
  10671.                 }
  10672.                 else if  ((trapshape == 5))
  10673.                 {// hypercross
  10674.                     d = abs(imag(zT) * real(zT));
  10675.                 }
  10676.                 else if  ((trapshape == 6))
  10677.                 {// cross
  10678.                     d = abs(real(zT));
  10679.                     d2 = abs(imag(zT));
  10680.                     if  ((d2 < d))
  10681.                     {
  10682.                         d = d2;
  10683.                     }
  10684.                 }
  10685.                 else if  ((trapshape == 7))
  10686.                 {// astroid
  10687.                     d = abs(real(zT))^traporder + abs(imag(zT))^traporder;
  10688.                     if  ((traporder < 0))
  10689.                     {
  10690.                         d = 1/d;
  10691.                     }
  10692.                 }
  10693.                 else if  ((trapshape == 8))
  10694.                 {// diamond
  10695.                     d = abs(real(zT)) + abs(imag(zT));
  10696.                 }
  10697.                 else if  ((trapshape == 9))
  10698.                 {// rectangle
  10699.                     d = abs(real(zT));
  10700.                     d2 = abs(imag(zT));
  10701.                     if  ((d2 > d))
  10702.                     {
  10703.                         d = d2;
  10704.                     }
  10705.                 }
  10706.                 else if  ((trapshape == 10))
  10707.                 {// box
  10708.                     d = abs(real(zT));
  10709.                     d2 = abs(imag(zT));
  10710.                     if  ((d2 > d))
  10711.                     {
  10712.                         d = d2;
  10713.                     }
  10714.                     d = abs(d - diameter);
  10715.                 }
  10716.                 else if  ((trapshape == 11))
  10717.                 {// lines
  10718.                     d = abs(abs(imag(zT)) - diameter);
  10719.                 }
  10720.                 else if  ((trapshape == 12))
  10721.                 {// waves
  10722.                     d = abs(abs(imag(zT) + sin(real(zT)*trapfreq)*traporder*0.25) - diameter);
  10723.                 }
  10724.                 else if  ((trapshape == 13))
  10725.                 {// mirrored waves
  10726.                     d = abs(abs(imag(zT)) - diameter + sin(real(zT)*trapfreq)*traporder*0.25);
  10727.                 }
  10728.                 else if  ((trapshape == 14))
  10729.                 {// mirrored waves 2
  10730.                     d2 = diameter - sin(real(zT)*trapfreq)*traporder*0.25;// compute wave height
  10731.                     d  = abs(abs(imag(zT)) - d2);// distance to each wave
  10732.                     d2 = abs(abs(imag(zT)) + d2);
  10733.                     if  ((d2 < d))
  10734.                     {
  10735.                         d = d2;
  10736.                     }
  10737.                 }
  10738.                 else if  ((trapshape == 15))
  10739.                 {// radial waves
  10740.                     d2 = atan2(zT);
  10741.                     d = abs(cabs(zT) * (1 - sin(d2*trapfreq)*traporder*0.125) - diameter);
  10742.                 }
  10743.                 else if  ((trapshape == 16))
  10744.                 {// radial waves 2
  10745.                     d2 = atan2(zT);
  10746.                     d2 = sin(d2*trapfreq)*traporder*0.125;
  10747.                     d = abs(cabs(zT) * (1 - d2) - diameter);
  10748.                     d2 = abs(cabs(zT) * (1 + d2) - diameter);
  10749.                     if  ((d2 < d))
  10750.                     {
  10751.                         d = d2;
  10752.                     }
  10753.                 }
  10754.                 else if  ((trapshape == 17))
  10755.                 {// ring ripples
  10756.                     d = cabs(zT);
  10757.                     if  ((d < traporder))
  10758.                     {
  10759.                         d = cos(d * diameter2 * trapfreq) * sqr(1-d/traporder);
  10760. //        d = (cos(d * diameter2 * @trapfreq)+1) * sqr(1-d/@traporder) * 0.5
  10761.                     }
  10762.                     else
  10763.                     {
  10764.  
  10765.                         d = 0;
  10766.                     }
  10767.                 }
  10768.                 else if  ((trapshape == 18))
  10769.                 {// grid ripples
  10770.                     d = cabs(zT);
  10771.                     if  ((d < traporder))
  10772.                     {
  10773.                         d = (cos(real(zT)*diameter2*trapfreq) + cos(imag(zT)*diameter2*trapfreq)) * sqr(1-d/traporder) * 0.5;
  10774.                     }
  10775.                     else
  10776.                     {
  10777.  
  10778.                         d = 0;
  10779.                     }
  10780.                 }
  10781.                 else if  ((trapshape == 19))
  10782.                 {// radial ripples
  10783.                     d = atan2(zT);
  10784.                     d2 = cabs(zT);
  10785.                     if  ((d2 < traporder))
  10786.                     {
  10787.                         d = cos(4 * d * trapfreq) * sqr(1-d2/traporder);
  10788.                     }
  10789.                     else
  10790.                     {
  10791.  
  10792.                         d = 0;
  10793.                     }
  10794.                 }
  10795.                 else if  ((trapshape == 20))
  10796.                 {// pinch
  10797.                     d2 = atan2(zT);
  10798.                     if  ((d2 < 0))
  10799.                     {
  10800.                         d2 = d2 + 2*pi;
  10801.                     }
  10802.                     d = sqrt(cabs(zT)) / abs(sin(d2*traporder*0.5));
  10803.                 }
  10804.                 else if  ((trapshape == 21))
  10805.                 {// spiral
  10806.                     d = 1/(cabs(zT)) * diameter;
  10807.                     r0 = (0,1) ^ d;
  10808.                     zT = zT * r0;
  10809.                     d = atan(abs(imag(zT)/real(zT)));
  10810.                 }
  10811.                 else if  ((trapshape == 22))
  10812.                 {// heart
  10813.                     zh = real(zT) + flip(abs(imag(zT)));
  10814.                     zh = zh*rh * 3 / diameter;
  10815.                     d = abs(real(zh) - sqr(imag(zh)) + 3);
  10816.                 }
  10817.  
  10818.     // apply trap transfer function
  10819.     // a function is not used because these are floats
  10820.     // and not all functions apply to floats
  10821.                 d = d * prescale;
  10822.                 if  ((trapfunc == 1))
  10823.                 {// log
  10824.                     d = log(d);
  10825.                 }
  10826.                 else if  ((trapfunc == 2))
  10827.                 {// sqrt
  10828.                     d = sqrt(d);
  10829.                 }
  10830.                 else if  ((trapfunc == 3))
  10831.                 {// cuberoot
  10832.                     d = (d)^(1/3);
  10833.                 }
  10834.                 else if  ((trapfunc == 4))
  10835.                 {// exp
  10836.                     d = exp(d);
  10837.                 }
  10838.                 else if  ((trapfunc == 5))
  10839.                 {// sqr
  10840.                     d = sqr(d);
  10841.                 }
  10842.                 else if  ((trapfunc == 6))
  10843.                 {// cube
  10844.                     d = (d)^3;
  10845.                 }
  10846.                 else if  ((trapfunc == 7))
  10847.                 {// sin
  10848.                     d = sin(d);
  10849.                 }
  10850.                 else if  ((trapfunc == 8))
  10851.                 {// cos
  10852.                     d = cos(d);
  10853.                 }
  10854.                 else if  ((trapfunc == 9))
  10855.                 {// tan
  10856.                     d = tan(d);
  10857.                 }
  10858.                 else if  ((trapfunc == 10))
  10859.                 {// sinc (modified form)
  10860.                     if  ((d == 0))
  10861.                     {
  10862.                         d = 1;
  10863.                     }
  10864.                     else
  10865.                     {
  10866.  
  10867.                         d = sin(pi*d)/d;
  10868.                     }
  10869.                 }
  10870.                 d = d * postscale;
  10871.                 if  ((trapabs))
  10872.                 {// absolute value only
  10873.                     d = abs(d);
  10874.                 }
  10875.  
  10876.     // now adjust closest/point/i as needed
  10877.                 if  ((movetrap == false || iter > 1))
  10878.                 {
  10879.                     if  ((traptype == 0))
  10880.                     {// closest
  10881.                         if  ((d < closest))
  10882.                         {
  10883.                             i = iter;
  10884.                             point = zP;
  10885.                             point2 = zT;
  10886.                             closest = d;
  10887.                         }
  10888. //        IF (d < @threshold)
  10889. //          usesolid = false
  10890. //        ENDIF
  10891.                     }
  10892.                     else if  ((traptype == 1))
  10893.                     {// farthest (within threshold)
  10894.                         if  ((d > closest && d < threshold))
  10895.                         {
  10896.                             i = iter;
  10897.                             point = zP;
  10898.                             point2 = zT;
  10899.                             closest = d;
  10900. //          usesolid = false
  10901.                         }
  10902.                     }
  10903.                     else if  ((traptype == 2))
  10904.                     {// first (within threshold)
  10905.                         if  ((d < threshold && done == false))
  10906.                         {
  10907.                             i = iter;
  10908.                             point = zP;
  10909.                             point2 = zT;
  10910.                             closest = d;
  10911.                             done = true;
  10912. //          usesolid = false
  10913.                         }
  10914.                     }
  10915.                     else if  ((traptype == 3))
  10916.                     {// last (within threshold)
  10917.                         if  ((d < threshold))
  10918.                         {
  10919.                             i = iter;
  10920.                             point = zP;
  10921.                             point2 = zT;
  10922.                             closest = d;
  10923.                             done = true;
  10924. //          usesolid = false
  10925.                         }
  10926.                     }
  10927.                     else if  ((traptype == 4))
  10928.                     {// sum (within threshold)
  10929.                         if  ((d < threshold))
  10930.                         {
  10931.                             i = iter;
  10932.                             point = point + zP;
  10933.                             point2 = point2 + zT;
  10934.                             closest = closest + d;
  10935. //          usesolid = false
  10936.                         }
  10937.                     }
  10938.                     else if  ((traptype == 5))
  10939.                     {// average (within threshold)
  10940.                         if  ((d < threshold))
  10941.                         {
  10942.                             i = iter;
  10943.                             i1 = i1 + 1;
  10944.                             point = point + zP;
  10945.                             point2 = point2 + zT;
  10946.                             closest = closest + d;
  10947. //          usesolid = false
  10948.                         }
  10949.                     }
  10950.                     else if  ((traptype == 6))
  10951.                     {// product (within threshold)
  10952.                         if  ((d < threshold))
  10953.                         {
  10954.                             i = iter;
  10955.                             point = point * zP / threshold;
  10956.                             point2 = point2 * zT / threshold;
  10957.                             closest = closest * d / threshold;
  10958. //          usesolid = false
  10959.                         }
  10960.                     }
  10961.                     else if  ((traptype == 7))
  10962.                     {// sign average
  10963.                         if  ((d < d2))
  10964.                         {
  10965.                             i = i + 1;
  10966.                             point = point + zP;
  10967.                             point2 = point2 + zT;
  10968.                             closest = closest + 1;
  10969. //          usesolid = false
  10970.                         }
  10971.                         else
  10972.                         {
  10973.  
  10974.                             i = i - 1;
  10975.                         }
  10976.                         d2 = d;
  10977.                     }
  10978.                     else if  ((traptype == 8 || traptype == 10))
  10979.                     {// second/two closest
  10980.                         if  ((d < closest))
  10981.                         {
  10982.                             i1 = i;
  10983.                             point1 = point;
  10984.                             point3 = point2;
  10985.                             closest1 = closest;
  10986.                             i = iter;
  10987.                             point = zP;
  10988.                             point2 = zT;
  10989.                             closest = d;
  10990.                         }
  10991.                         else if  ((d < closest1))
  10992.                         {
  10993.                             i1 = iter;
  10994.                             point1 = zP;
  10995.                             point3 = zT;
  10996.                             closest1 = d;
  10997.                         }
  10998. //        IF (d < @threshold)
  10999. //          usesolid = false
  11000. //        ENDIF
  11001.                     }
  11002.                     else if  ((traptype == 9 || traptype == 11))
  11003.                     {// second/two farthest
  11004.                         if  ((d > closest && d < threshold))
  11005.                         {
  11006.                             i1 = i;
  11007.                             point1 = point;
  11008.                             point3 = point2;
  11009.                             closest1 = closest;
  11010.                             i = iter;
  11011.                             point = zP;
  11012.                             point2 = zT;
  11013.                             closest = d;
  11014. //          usesolid = false
  11015.                         }
  11016.                         else if  ((d > closest1 && d < threshold))
  11017.                         {
  11018.                             i1 = iter;
  11019.                             point1 = zP;
  11020.                             point3 = zT;
  11021.                             closest1 = d;
  11022. //          usesolid = false
  11023.                         }
  11024.                     }
  11025.                     else if  ((traptype == 12))
  11026.                     {// funky average
  11027.                         if  ((d < threshold))
  11028.                         {
  11029.                             i = i + 1;
  11030.                             point = zP - point;
  11031.                             point2 = zT - point2;
  11032.                             closest = threshold - abs(closest - d);
  11033. //          usesolid = false
  11034.                         }
  11035.                     }
  11036.                     else if  ((traptype == 13))
  11037.                     {// funky average 2
  11038.                         if  ((d < threshold))
  11039.                         {
  11040.                             i = i + 1;
  11041.                             point = zP - point;
  11042.                             point2 = zT - point2;
  11043.                             closest = abs(d - threshold + closest);
  11044. //          usesolid = false
  11045.                         }
  11046.                     }
  11047.                     else if  ((traptype == 14))
  11048.                     {// funky average 3 (Luke Plant)
  11049.                         if  ((d < threshold))
  11050.                         {
  11051.                             i = i + 1;
  11052.                             d2 = d/threshold;
  11053.                             point = zP + (point-zP) * d2;
  11054.                             point2 = zT + (point2-zT) * d2;
  11055.                             closest = closest + d;
  11056. //          usesolid = false
  11057.                         }
  11058.                     }
  11059.                     else if  ((traptype == 15))
  11060.                     {// funky average 4 (exponential average)
  11061.                         if  ((d < threshold))
  11062.                         {
  11063.                             i = i + 1;
  11064.                             point = zP - point;
  11065.                             point2 = zT - point2;
  11066.                             closest = closest + exp(-d);
  11067. //          usesolid = false
  11068.                         }
  11069.                     }
  11070.                     else if  ((traptype == 16))
  11071.                     {// funky average 5 (average distance change)
  11072.                         if  ((d < d2))
  11073.                         {
  11074.                             point = point + zP;
  11075.                             point2 = point2 + zT;
  11076.                             closest = closest + d2-d;
  11077. //          usesolid = false
  11078.                         }
  11079.                         d2 = d;
  11080.                     }
  11081.                     else if  ((traptype == 17))
  11082.                     {// funky average 6 (Luke Plant, 1/squared)
  11083.                         if  ((d < threshold))
  11084.                         {
  11085.                             i = i + 1;
  11086. //          usesolid = false
  11087.                         }
  11088.                         d2 = sqr(d/threshold);
  11089.                         point = zP + (point-zP) * d2;
  11090.                         point2 = zT + (point2-zT) * d2;
  11091.                         closest = closest + 1/d2;
  11092.                     }
  11093.                     else if  ((traptype == 18))
  11094.                     {// trap only, do first iteration
  11095.                         if  ((iter == 1))
  11096.                         {
  11097.                             point = zP;
  11098.                             point2 = zT;
  11099.                             closest = d/threshold;
  11100. //          IF (d < @threshold)
  11101. //            usesolid = false
  11102. //          ENDIF
  11103.                         }
  11104.                     }
  11105.                 }
  11106.  
  11107.                 if  ((j == 0))
  11108.                 {
  11109.                     z1closest = closest;
  11110.                     z1closest1 = closest1;
  11111.                     z1i = i;
  11112.                     z1i1 = i1;
  11113.                     z1point = point;
  11114.                     z1point1 = point1;
  11115.                     z1point2 = point2;
  11116.                     z1point3 = point3;
  11117.                 }
  11118.                 else if  ((j == 1))
  11119.                 {
  11120.                     z2closest = closest;
  11121.                     z2closest1 = closest1;
  11122.                     z2i = i;
  11123.                     z2i1 = i1;
  11124.                     z2point = point;
  11125.                     z2point1 = point1;
  11126.                     z2point2 = point2;
  11127.                     z2point3 = point3;
  11128.                 }
  11129.                 else
  11130.                 {
  11131.  
  11132.                     z3closest = closest;
  11133.                     z3closest1 = closest1;
  11134.                     z3i = i;
  11135.                     z3i1 = i1;
  11136.                     z3point = point;
  11137.                     z3point1 = point1;
  11138.                     z3point2 = point2;
  11139.                     z3point3 = point3;
  11140.                 }
  11141.                 j = j + 1;
  11142.             }
  11143.  
  11144.         }
  11145.  
  11146.   // determine surface normal if necessary
  11147.         modz = |z1|;
  11148.         if  ((modz > bailout ||everyiter ||iter == maxit))
  11149.         {// done, or every iteration, or last
  11150.     // determine (height) for each point (final calculations)
  11151.  
  11152.             j = 0;
  11153.             while  ((j < 3))
  11154.             {
  11155.                 if  ((j == 0))
  11156.                 {
  11157.                     zP = z1;
  11158.                     cT = pixel;
  11159.                     closest = z1closest;
  11160.                     closest1 = z1closest1;
  11161.                     i = z1i;
  11162.                     i1 = z1i1;
  11163.                     point = z1point;
  11164.                     point1 = z1point1;
  11165.                     point2 = z1point2;
  11166.                     point3 = z1point3;
  11167.                 }
  11168.                 else if  ((j == 1))
  11169.                 {
  11170.                     zP = z2;
  11171.                     cT = pixel + offset;
  11172.                     closest = z2closest;
  11173.                     closest1 = z2closest1;
  11174.                     i = z2i;
  11175.                     i1 = z2i1;
  11176.                     point = z2point;
  11177.                     point1 = z2point1;
  11178.                     point2 = z2point2;
  11179.                     point3 = z2point3;
  11180.                 }
  11181.                 else
  11182.                 {
  11183.  
  11184.                     zP = z3;
  11185.                     cT = pixel + flip(offset);
  11186.                     closest = z3closest;
  11187.                     closest1 = z3closest1;
  11188.                     i = z3i;
  11189.                     i1 = z3i1;
  11190.                     point = z3point;
  11191.                     point1 = z3point1;
  11192.                     point2 = z3point2;
  11193.                     point3 = z3point3;
  11194.                 }
  11195.  
  11196.                 if  ((traptype == 5))
  11197.                 {// traptype average
  11198.                     point = point / i1;
  11199.                     point2 = point2 / i1;
  11200.                     closest = closest / i1;
  11201.                 }
  11202.                 else if  ((traptype == 6))
  11203.                 {// traptype product
  11204.                     closest = abs(closest);
  11205.                 }
  11206.                 else if  ((traptype == 7))
  11207.                 {// traptype sign average
  11208.                     point = point / iter;
  11209.                     point2 = point2 / iter;
  11210.                     closest = closest / iter;
  11211.                 }
  11212.                 else if  ((traptype == 8 || traptype == 9))
  11213.                 {// second closest or farthest
  11214.                     i = i - i1;
  11215.                     point = point - point1;
  11216.                     point2 = point2 - point3;
  11217.                     closest = closest - closest1;
  11218.                 }
  11219.                 else if  ((traptype == 10 || traptype == 11))
  11220.                 {// two closest or farthest
  11221.                     i = round((i + i1) / 2);
  11222.                     point = (point + point1) / 2;
  11223.                     point2 = (point2 + point3) / 2;
  11224.                     closest = (closest + closest1) / 2;
  11225.                 }
  11226.                 else if  ((traptype == 14))
  11227.                 {// funky average 3
  11228.                     closest = threshold * i - closest;
  11229.                 }
  11230.  
  11231.     // choose coloring based on method
  11232. //    IF (!@solidcolor); solid color not allowed
  11233. //      #solid = false
  11234. //    ELSE
  11235. //      #solid = usesolid
  11236. //    ENDIF
  11237.                 if  ((trapcolor == 0))
  11238.                 {// distance
  11239.                     if  ((traptype == 2 || traptype == 3))
  11240.                     {// first or last type
  11241.                         d = closest / threshold;
  11242.                     }
  11243.                     else
  11244.                     {
  11245. // any other trap type
  11246.                         d = closest;
  11247.                     }
  11248.                 }
  11249.                 else if  ((trapcolor == 1))
  11250.                 {// magnitude
  11251.                     d = cabs(point2);
  11252.                 }
  11253.                 else if  ((trapcolor == 2))
  11254.                 {// real
  11255.                     d = abs(real(point2));
  11256.                 }
  11257.                 else if  ((trapcolor == 3))
  11258.                 {// imaginary
  11259.                     d = abs(imag(point2));
  11260.                 }
  11261.                 else if  ((trapcolor == 4))
  11262.                 {// angle to trap
  11263.                     d = atan2(point2);
  11264.                     if  ((d < 0))
  11265.                     {
  11266.                         d = d + pi * 2;
  11267.                     }
  11268.                     d = d / (pi * 2);
  11269.                 }
  11270.                 else if  ((trapcolor == 5))
  11271.                 {// angle to trap 2 (no aspect)
  11272.                     point = point - trapcenter;
  11273.                     d = atan2(point);
  11274.                     if  ((d < 0))
  11275.                     {
  11276.                         d = d + pi * 2;
  11277.                     }
  11278.                     d = d / (pi * 2);
  11279.                 }
  11280.                 else if  ((trapcolor == 6))
  11281.                 {// angle to origin
  11282.                     d = atan2(point);
  11283.                     if  ((d < 0))
  11284.                     {
  11285.                         d = d + pi * 2;
  11286.                     }
  11287.                     d = d / (pi * 2);
  11288.                 }
  11289.                 else if  ((trapcolor == 7))
  11290.                 {// angle to origin 2 (old ReallyCool)
  11291.                     d = 0.02 * abs(atan(imag(point) / real(point)) * 180/pi);
  11292.                 }
  11293.                 else if  ((trapcolor == 8))
  11294.                 {// iteration
  11295.                     d = i;
  11296.                     d = d / maxiter;
  11297.                 }
  11298.  
  11299.                 if  ((j == 0))
  11300.                 {
  11301.                     e1 = d;
  11302.                 }
  11303.                 else if  ((j == 1))
  11304.                 {
  11305.                     e2 = d;
  11306.                 }
  11307.                 else
  11308.                 {
  11309.  
  11310.                     e3 = d;
  11311.                 }
  11312.                 j = j + 1;
  11313.             }
  11314.  
  11315.     // apply pre-scale
  11316.             e1 = e1 * zscale;
  11317.             e2 = e2 * zscale;
  11318.             e3 = e3 * zscale;
  11319.  
  11320.     // apply transfer function
  11321.     // a function is not used because these are floats
  11322.     // and not all functions apply to floats
  11323.             if  ((xfer == 1))
  11324.             {// log
  11325.                 e1 = log(e1);
  11326.                 e2 = log(e2);
  11327.                 e3 = log(e3);
  11328.             }
  11329.             else if  ((xfer == 2))
  11330.             {// sqrt
  11331.                 e1 = sqrt(e1);
  11332.                 e2 = sqrt(e2);
  11333.                 e3 = sqrt(e3);
  11334.             }
  11335.             else if  ((xfer == 3))
  11336.             {// cuberoot
  11337.                 e1 = (e1)^(1/3);
  11338.                 e2 = (e2)^(1/3);
  11339.                 e3 = (e3)^(1/3);
  11340.             }
  11341.             else if  ((xfer == 4))
  11342.             {// exp
  11343.                 e1 = exp(e1);
  11344.                 e2 = exp(e2);
  11345.                 e3 = exp(e3);
  11346.             }
  11347.             else if  ((xfer == 5))
  11348.             {// sqr
  11349.                 e1 = sqr(e1);
  11350.                 e2 = sqr(e2);
  11351.                 e3 = sqr(e3);
  11352.             }
  11353.             else if  ((xfer == 6))
  11354.             {// cube
  11355.                 e1 = (e1)^3;
  11356.                 e2 = (e2)^3;
  11357.                 e3 = (e3)^3;
  11358.             }
  11359.             else if  ((xfer == 7))
  11360.             {// sin
  11361.                 e1 = sin(e1);
  11362.                 e2 = sin(e2);
  11363.                 e3 = sin(e3);
  11364.             }
  11365.             else if  ((xfer == 8))
  11366.             {// cos
  11367.                 e1 = cos(e1);
  11368.                 e2 = cos(e2);
  11369.                 e3 = cos(e3);
  11370.             }
  11371.             else if  ((xfer == 9))
  11372.             {// tan
  11373.                 e1 = tan(e1);
  11374.                 e2 = tan(e2);
  11375.                 e3 = tan(e3);
  11376.             }
  11377.  
  11378.     // apply post-scale
  11379.             e1 = e1 * zscale2;
  11380.             e2 = e2 * zscale2;
  11381.             e3 = e3 * zscale2;
  11382.  
  11383.     // determine surface normal
  11384.     // that is, the normal to the surface defined by:
  11385.     // (real(c1), imag(c1), e1)
  11386.     // (real(c2), imag(c2), e2)
  11387.     // (real(c3), imag(c3), e3)
  11388.             vx = e2-e1;
  11389.             vy = e3-e1;
  11390.             vz = -offset;
  11391.     // normalize vector
  11392.             vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz));
  11393.             vx = vx*vd;
  11394.             vy = vy*vd;
  11395.             vz = vz*vd;
  11396.             z = vx + flip(vy);// fudge z from vector
  11397.         }
  11398.         else
  11399.         {
  11400. // didn't compute z this time
  11401.             z = z1;// use primary iteration value to keep periodicity working
  11402.         }
  11403.         if  ((modz > bailout))
  11404.         {// we're done
  11405.             iter = -1;
  11406.         }
  11407.   
  11408.     }
  11409.     bool bailout(void)
  11410.     {
  11411.         return(iter > 0);
  11412.   
  11413.     }
  11414.     void description(void)
  11415.     {
  11416.         this.title = "SlopeTrap (Julia)";
  11417.         this.helpfile = "dmj-pub\dmj-pub-uf-st.htm";
  11418.         this.center = (0.0, 0.0);
  11419.         this.maxiter = 1000;
  11420.  
  11421.    
  11422.         seed.caption = "Julia Seed";
  11423.         seed.default = (0,0);
  11424.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  11425.   
  11426.    
  11427.         power.caption = "Exponent";
  11428.         power.default = (2,0);
  11429.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Julia type.";
  11430.   
  11431.    
  11432.         bailout.caption = "Bail-out Value";
  11433.         bailout.default = 1.0e20;
  11434.         bailout.min = 0.0;
  11435.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Julia set anymore.";
  11436.   
  11437.  
  11438.    
  11439.         trapshape.caption = "Trap Shape";
  11440.         trapshape.default = 0;
  11441.         trapshape.enum = "point\nring\nring 2\negg\nhyperbola\nhypercross\ncross\nastroid\ndiamond\nrectangle\nbox\nlines\nwaves\nmirrored waves\nmirrored waves 2\nradial waves\nradial waves 2\nring ripples\ngrid ripples\nradial ripples\npinch\nspiral\nheart";
  11442.         trapshape.hint = "This is the shape of the orbit trap.";
  11443.   
  11444.    
  11445.         trapcolor.caption = "Trap Coloring";
  11446.         trapcolor.default = 0;
  11447.         trapcolor.enum = "distance\nmagnitude\nreal\nimaginary\nangle to trap\nangle to trap 2\nangle to origin\nangle to origin 2\niteration";
  11448.         trapcolor.hint = "This is the information used to produce a color.";
  11449.   
  11450.    
  11451.         traptype.caption = "Trap Mode";
  11452.         traptype.default = 0;
  11453.         traptype.enum = "closest\nfarthest\nfirst\nlast\nsum\naverage\nproduct\nsign average\nsecond closest\nsecond farthest\ntwo closest\ntwo farthest\nfunky average\nfunky average 2\nfunky average 3\nfunky average 4\nfunky average 5\nfunky average 6\ntrap only";
  11454.         traptype.hint = "This is how points will be chosen to use for coloring.";
  11455.   
  11456.    
  11457.         traporder.caption = "Trap Order";
  11458.         traporder.default = 4.0;
  11459.         traporder.hint = "Number of leaves for the pinch trap shape, the exponent to use for astroid curves (try 0.66667), 'egginess', or the height of waves.";
  11460.   
  11461.    
  11462.         trapfreq.caption = "Trap Frequency";
  11463.         trapfreq.default = 1.0;
  11464.         trapfreq.hint = "The frequency of ripples or waves.";
  11465.   
  11466.    
  11467.         trapcenter.caption = "Trap Center";
  11468.         trapcenter.default = (0,0);
  11469.         trapcenter.hint = "This is the location of the trap in the complex plane.";
  11470.   
  11471.    
  11472.         trapdrift.caption = "Trap Drift";
  11473.         trapdrift.default = (0,0);
  11474.         trapdrift.hint = "This is the amount the trap center will move with each iteration.";
  11475.   
  11476.    
  11477.         traporbit.caption = "Trap Orbit";
  11478.         traporbit.default = (0,0);
  11479.         traporbit.hint = "The trap center location is multiplied by this value with each iteration.";
  11480.   
  11481.    
  11482.         movetrap.caption = "Trap Center Moves";
  11483.         movetrap.default = false;
  11484.         movetrap.hint = "If this is enabled, the trap center will match the pixel location instead of being fixed.  This overrides Trap Center.";
  11485.   
  11486.    
  11487.         aspect.caption = "Aspect Ratio";
  11488.         aspect.default = 1.0;
  11489.         aspect.min = 0.0000000001;
  11490.         aspect.hint = "This is how square the trap is.  You can distort the trap by using a value other than 1.0.";
  11491.   
  11492.    
  11493.         threshold.caption = "Threshold";
  11494.         threshold.default = 0.25;
  11495.         threshold.min = 0;
  11496.         threshold.hint = "This is the width of the trap area, used for most trap modes.";
  11497.   
  11498.    
  11499.         diameter.caption = "Diameter";
  11500.         diameter.default = 1.0;
  11501. //    min = 0
  11502.         diameter.hint = "This is the diameter of the trap (for ring, box, and line shapes).";
  11503.   
  11504.    
  11505.         Parm_angle.caption = "Rotation";
  11506.         Parm_angle.default = 0.0;
  11507.         Parm_angle.hint = "This is the angle, in degrees, that the trap should be rotated.";
  11508.   
  11509.    
  11510.         anglestep.caption = "Rotation Step";
  11511.         anglestep.default = 0.0;
  11512.         anglestep.hint = "This is the angle, in degrees, that the trap will be rotated with each iteration.";
  11513.   
  11514.    
  11515.         skew.caption = "Skew";
  11516.         skew.default = 0.0;
  11517.         skew.hint = "This is the angle, in degrees, to skew the vertical axis of the trap shape.";
  11518.   
  11519.    
  11520.         skewstep.caption = "Skew Step";
  11521.         skewstep.default = 0.0;
  11522.         skewstep.hint = "This is the angle, in degrees, that the skew angle should be increased by with each iteration.";
  11523.   
  11524.    
  11525.         trapfunc.caption = "Distance Transfer";
  11526.         trapfunc.default = 0;
  11527.         trapfunc.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan\nsinc";
  11528.         trapfunc.hint = "This function is applied to trap distances at every iteration. It can be used to apply some special effects to trap shapes.";
  11529.   
  11530.    
  11531.         prescale.caption = "Distance Pre-scale";
  11532.         prescale.default = 1.0;
  11533.         prescale.hint = "This is a multiplier applied to the trap distance, before the Distance Transfer function is applied to it.";
  11534.   
  11535.    
  11536.         postscale.caption = "Distance Post-scale";
  11537.         postscale.default = 1.0;
  11538.         postscale.hint = "This is a multiplier applied to the trap distance, after the Distance Transfer function is applied to it.";
  11539.   
  11540.    
  11541.         trapabs.caption = "No Negative Distance";
  11542.         trapabs.default = false;
  11543.         trapabs.hint = "If enabled, eliminates 'negative' distances by taking the absolute value of the distance.";
  11544.   
  11545.    
  11546.         trapstart.caption = "Start Iteration";
  11547.         trapstart.default = 0.0;
  11548.         trapstart.hint = "This is the iteration at which to start watching for orbit traps.";
  11549.   
  11550.    
  11551.         trapiter.caption = "Trap Iterations";
  11552.         trapiter.default = 10000.0;
  11553.         trapiter.hint = "This is the number of iterations to watch for traps in a single block.";
  11554.   
  11555.    
  11556.         trapskip.caption = "Skip Iterations";
  11557.         trapskip.default = 0.0;
  11558.         trapskip.hint = "This is the number of iterations to skip watching for traps, after a block of watched iterations.";
  11559.   
  11560.    
  11561.         gauss.caption = "Repeat Spacing";
  11562.         gauss.default = 0.0;
  11563.         gauss.min = 0.0;
  11564.         gauss.hint = "This is the spacing at which the trap will repeat, all across the complex plane.  If zero, trap does not repeat.";
  11565.   
  11566.    
  11567.         gaussgcenter.caption = "Repeat Center";
  11568.         gaussgcenter.default = (0,0);
  11569.         gaussgcenter.hint = "This is the center point of grid trap repetition.";
  11570.   
  11571.    
  11572.         gaussr.caption = "Radial Spacing";
  11573.         gaussr.default = 0.0;
  11574.         gaussr.min = 0;
  11575.         gaussr.hint = "This is the number of times the trap will repeat, radially around the radial center point.  If zero, trap does not repeat radially.";
  11576.   
  11577.    
  11578.         gausss.caption = "Concentric Spacing";
  11579.         gausss.default = 0.0;
  11580.         gausss.min = 0;
  11581.         gausss.hint = "This is the distance at which the trap will repeat, radially out from the radial center point.  If zero, trap does not repeat radially out.";
  11582.   
  11583.    
  11584.         gausscenter.caption = "Radial Center";
  11585.         gausscenter.default = (0,0);
  11586.         gausscenter.hint = "This is the center point of radial trap repetition.";
  11587.   
  11588.    
  11589.         radialmode.caption = "Radial Mode";
  11590.         radialmode.default = 0;
  11591.         radialmode.enum = "kaleidoscope\npolar coordinates";
  11592.         radialmode.hint = "Indicates the type of radial repetition to use.  The two styles produce very different results.";
  11593.   
  11594.  
  11595.    
  11596.         offset.caption = "Orbit Separation";
  11597.         offset.default = 0.00000001;
  11598.         offset.hint = "Defines how far apart the simultaneous orbits are.  Smaller distances will produce more accurate results.";
  11599.   
  11600.    
  11601.         xfer.caption = "Height Transfer";
  11602.         xfer.default = 0;
  11603.         xfer.enum = "linear\nlog\nsqrt\ncuberoot\nexp\nsqr\ncube\nsin\ncos\ntan";
  11604.         xfer.hint = "This function will be applied to the height value before a slope is calculated.";
  11605.   
  11606.    
  11607.         zscale.caption = "Height Pre-Scale";
  11608.         zscale.default = 1.0;
  11609.         zscale.hint = "Specifies the ratio between height and distance.  Higher values will exaggerate differences between high and low. In general, you will want to use smaller numbers here.";
  11610.   
  11611.    
  11612.         zscale2.caption = "Height Post-Scale";
  11613.         zscale2.default = 0.025;
  11614.         zscale2.hint = "Specifies the ratio between height and distance; like Height Pre-Scale, except that this value is applied after the transfer function.";
  11615.   
  11616.    
  11617.         everyiter.caption = "Every Iteration";
  11618.         everyiter.default = false;
  11619.         everyiter.hint = "If set, the surface normal will be computed at every iteration.  If you are using a coloring algorithm which processes every iteration, you will need this.";
  11620.   
  11621.  
  11622.     }
  11623. }
  11624.  
  11625.  
  11626. dmj-SNovaMandel {
  11627. //
  11628. // This is the SinNova fractal (Mandelbrot form), a
  11629. // modified Newtonian-style fractal.  The formula
  11630. // was first shown to me by Paul Derbyshire (who
  11631. // named it Nova).  It has also appeared elsewhere
  11632. // under other names.  Use this formula and the
  11633. // Switch feature to select a NovaJulia.
  11634. //
  11635. complex zold;
  11636. parameter complex start;
  11637. parameter complex relax;
  11638. parameter complex power;
  11639. parameter real bailout;
  11640.  
  11641.     void init(void)
  11642.     {
  11643.         zold = (0,0);
  11644.   
  11645.         z = start;
  11646.   
  11647.     }
  11648.     void loop(void)
  11649.     {
  11650.         zold = z;
  11651.         z = z - relax * (sin(z)^power-1) / (power * sin(z)^(power-1) * cos(z)) + pixel;
  11652.   
  11653.     }
  11654.     bool bailout(void)
  11655.     {
  11656.         return(|z - zold| > bailout);
  11657.   
  11658.     }
  11659.     void description(void)
  11660.     {
  11661.         this.title = "SinNova (Mandelbrot)";
  11662.         this.helpfile = "dmj-pub\dmj-pub-uf-sn.htm";
  11663.         this.maxiter = 1000;
  11664.         this.periodicity = 0;
  11665.         this.center = (-0.5,0);
  11666.         this.magn = 1.5;
  11667.   
  11668.    
  11669.         start.caption = "Start Value";
  11670.         start.default = (1,0);
  11671.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  11672.   
  11673.    
  11674.         power.caption = "Exponent";
  11675.         power.default = (3,0);
  11676.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  11677.   
  11678.    
  11679.         bailout.caption = "Bailout";
  11680.         bailout.default = 0.00001;
  11681.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  11682.   
  11683.    
  11684.         relax.caption = "Relaxation";
  11685.         relax.default = (1,0);
  11686.         relax.hint = "This can be used to slow down the convergence of the formula.";
  11687.   
  11688.  
  11689.     }
  11690. }
  11691.  
  11692.  
  11693. dmj-SNovaJulia {
  11694. //
  11695. // This is the SinNova fractal (Julia form), a
  11696. // modified Newtonian-style fractal.  The formula
  11697. // was first shown to me by Paul Derbyshire (who
  11698. // named it Nova).  It has also appeared elsewhere
  11699. // under other names.  If you leave the Julia
  11700. // seed at the default (0,0), you can use this as
  11701. // a general Newton-style fractal as in FractInt.
  11702. //
  11703. complex zold;
  11704. parameter complex relax;
  11705. parameter complex power;
  11706. parameter complex seed;
  11707. parameter real bailout;
  11708.  
  11709.     void init(void)
  11710.     {
  11711.         zold = (0,0);
  11712.   
  11713.         z = pixel;
  11714.   
  11715.     }
  11716.     void loop(void)
  11717.     {
  11718.         zold = z;
  11719.         z = z - relax * (sin(z)^power-1) / (power * sin(z)^(power-1) * cos(z)) + seed;
  11720.   
  11721.     }
  11722.     bool bailout(void)
  11723.     {
  11724.         return(|z - zold| > bailout);
  11725.   
  11726.     }
  11727.     void description(void)
  11728.     {
  11729.         this.title = "SinNova (Julia)";
  11730.         this.helpfile = "dmj-pub\dmj-pub-uf-sn.htm";
  11731.         this.maxiter = 1000;
  11732.         this.periodicity = 0;
  11733.         this.center = (0,0);
  11734.         this.magn = 1.5;
  11735.   
  11736.    
  11737.         seed.caption = "Julia Seed";
  11738.         seed.default = (0,0);
  11739.         seed.hint = "This is the Julia seed, a constant parameter which defines the shape of the fractal.";
  11740.   
  11741.    
  11742.         power.caption = "Exponent";
  11743.         power.default = (3,0);
  11744.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic Nova type.";
  11745.   
  11746.    
  11747.         bailout.caption = "Bailout";
  11748.         bailout.default = 0.00001;
  11749.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  11750.   
  11751.    
  11752.         relax.caption = "Relaxation";
  11753.         relax.default = (1,0);
  11754.         relax.hint = "This can be used to slow down the convergence of the formula.";
  11755.   
  11756.  
  11757.     }
  11758. }
  11759.  
  11760.  
  11761. dmj-StutterMandel {
  11762. //
  11763. // I got this idea while looking at '99 contest entries.
  11764. // The essential idea is to perform a normal Mandelbrot
  11765. // iteration for a while, and then "reset" the calculation,
  11766. // using the current z as a new c and then setting z back
  11767. // to the start value.
  11768. //
  11769. parameter complex start;
  11770. complex c;
  11771. real f;
  11772. parameter real restart;
  11773. parameter complex power;
  11774. parameter real bailout;
  11775.  
  11776.     void init(void)
  11777.     {
  11778.         z = start;
  11779.         c = pixel;
  11780.         f = restart;
  11781.   
  11782.     }
  11783.     void loop(void)
  11784.     {
  11785.         f = f - 1;
  11786.         if  ((f <= 0))
  11787.         {
  11788.             f = f + restart;
  11789.             c = z;
  11790.             z = start;
  11791.         }
  11792.         z = z^power + c;
  11793.   
  11794.     }
  11795.     bool bailout(void)
  11796.     {
  11797.         return(|z| < bailout);
  11798.   
  11799.     }
  11800.     void description(void)
  11801.     {
  11802.         this.title = "StutterMandel";
  11803.         this.helpfile = "dmj-pub\dmj-pub-uf-stutter.htm";
  11804.         this.center = (-0.5,0);
  11805.         this.periodicity = 0;
  11806.         this.maxiter = 1000;
  11807.  
  11808.    
  11809.         start.caption = "Start Value";
  11810.         start.default = (0,0);
  11811.         start.hint = "Starting value for each point.  You can use this to 'perturb' the fractal.";
  11812.   
  11813.    
  11814.         power.caption = "Exponent";
  11815.         power.default = (2,0);
  11816.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  11817.   
  11818.    
  11819.         bailout.caption = "Bailout";
  11820.         bailout.default = 1e20;
  11821.         bailout.hint = "Bailout value; larger values will cause more iterations to be done for each point.";
  11822.   
  11823.   
  11824.    
  11825.         restart.caption = "Restart Interval";
  11826.         restart.default = 16.0;
  11827.         restart.min = 1e-10;
  11828.         restart.hint = "Specifies the number of iterations before c is reset.";
  11829.   
  11830.     }
  11831. }
  11832.  
  11833.  
  11834. dmj-TorusMandel {
  11835. //
  11836. // This is a simple implementation of Earl Hinrichs'
  11837. // torus-method renderings of the 4D Julibrot fractal.
  11838. // Don't try to wrap your head around the 4D torus
  11839. // shape, it will cause you pain. :) Just keep in mind
  11840. // that each image axis represents a circle in 4D
  11841. // space that is perpendicular to the circle used for
  11842. // the other image axis.
  11843. //
  11844. // These images naturally repeat. With the right
  11845. // settings, you can make tileable images with them.
  11846. //
  11847. complex c;
  11848. parameter complex scale1;
  11849. parameter complex scale2;
  11850. parameter complex power;
  11851. parameter real bailout;
  11852.  
  11853.     void init(void)
  11854.     {
  11855.         c = (0,1)^(imag(pixel));
  11856.         z = (0,1)^(real(pixel));
  11857.         z = real(z)*real(scale1) + flip(imag(z)*imag(scale1));
  11858.         c = real(c)*real(scale2) + flip(imag(c)*imag(scale2));
  11859.   
  11860.     }
  11861.     void loop(void)
  11862.     {
  11863.         z = z^power + c;
  11864.   
  11865.     }
  11866.     bool bailout(void)
  11867.     {
  11868.         return(|z| < bailout);
  11869.   
  11870.     }
  11871.     void description(void)
  11872.     {
  11873.         this.title = "Torus (Julibrot)";
  11874.         this.helpfile = "dmj-pub\dmj-pub-uf-tj.htm";
  11875.         this.maxiter = 1000;
  11876.         this.center = (0,0);
  11877.         this.magn = 1.0;
  11878.   
  11879.    
  11880.         power.caption = "Exponent";
  11881.         power.default = (2,0);
  11882.         power.hint = "Overall exponent for the equation.  (2,0) gives the classic Mandelbrot type.";
  11883.   
  11884.    
  11885.         bailout.caption = "Bailout";
  11886.         bailout.default = 1.0e20;
  11887.         bailout.hint = "Defines how soon an orbit bails out, i.e. doesn't belong to the Mandelbrot set anymore.";
  11888.   
  11889.  
  11890.    
  11891.         scale1.caption = "Ring 1 Scale";
  11892.         scale1.default = (1.0,1.0);
  11893.         scale1.hint = "Sets the width and height of the ring used for the real axis, carved through z space.";
  11894.   
  11895.    
  11896.         scale2.caption = "Ring 2 Scale";
  11897.         scale2.default = (1.0,1.0);
  11898.         scale2.hint = "Sets the width and height of the ring used for the imaginary axis, carved through c space.";
  11899.   
  11900.     }
  11901. }
  11902.  
  11903.  
  11904. dmj-TorusNova {
  11905. //
  11906. // This is a simple implementation of Earl Hinrichs'
  11907. // torus-method renderings of the 4D NovaM/J fractal.
  11908. // Don't try to wrap your head around the 4D torus
  11909. // shape, it will cause you pain. :) Just keep in mind
  11910. // that each image axis represents a circle in 4D
  11911. // space that is perpendicular to the circle used for
  11912. // the other image axis.
  11913. //
  11914. // These images naturally repeat. With the right
  11915. // settings, you can make tileable images with them.
  11916. //
  11917. complex c;
  11918. parameter complex scale1;
  11919. parameter complex scale2;
  11920. complex zsquared;
  11921. complex zcubed;
  11922. complex zold;
  11923. parameter complex power;
  11924. parameter complex relax;
  11925. parameter real bailout;
  11926.  
  11927.     void init(void)
  11928.     {
  11929.         c = (0,1)^(imag(pixel));
  11930.         z = (0,1)^(real(pixel));
  11931.         z = real(z)*real(scale1) + flip(imag(z)*imag(scale1));
  11932.         c = real(c)*real(scale2) + flip(imag(c)*imag(scale2));
  11933.  
  11934.         zsquared = (0,0);
  11935.         zcubed = (0,0);
  11936.         zold = (0,0);
  11937.   
  11938.     }
  11939.     void loop(void)
  11940.     {
  11941.         if  ((power == (3,0)))
  11942.         {// special optimized routine for power 3
  11943.             zsquared = sqr(z);
  11944.             zcubed = zsquared * z;
  11945.             zold = z;
  11946.             z = z - relax * (zcubed-1) / (3*zsquared) + c;
  11947.         }
  11948.         else
  11949.         {
  11950.  
  11951.             zold = z;
  11952.             z = z - relax * (z^power-1) / (power * z^(power-1)) + c;
  11953.         }
  11954.   
  11955.     }
  11956.     bool bailout(void)
  11957.     {
  11958.         return(|z-zold| > bailout);
  11959.   
  11960.     }
  11961.     void description(void)
  11962.     {
  11963.         this.title = "Torus (Nova)";
  11964.         this.helpfile = "dmj-pub\dmj-pub-uf-tn.htm";
  11965.         this.maxiter = 1000;
  11966.         this.periodicity = 0;
  11967.         this.center = (0,0);
  11968.         this.magn = 1.0;
  11969.   
  11970.    
  11971.         power.caption = "Exponent";
  11972.         power.default = (3,0);
  11973.         power.hint = "Overall exponent for the equation.  (3,0) gives the classic NovaM type.";
  11974.   
  11975.    
  11976.         bailout.caption = "Bailout";
  11977.         bailout.default = 0.00001;
  11978.         bailout.hint = "Bailout value; smaller values will cause more iterations to be done for each point.";
  11979.   
  11980.    
  11981.         relax.caption = "Relaxation";
  11982.         relax.default = (1,0);
  11983.         relax.hint = "This can be used to slow down the convergence of the formula.";
  11984.   
  11985.  
  11986.    
  11987.         scale1.caption = "Ring 1 Scale";
  11988.         scale1.default = (1.0,1.0);
  11989.         scale1.hint = "Sets the width and height of the ring used for the real axis, carved through z space.";
  11990.   
  11991.    
  11992.         scale2.caption = "Ring 2 Scale";
  11993.         scale2.default = (1.0,1.0);
  11994.         scale2.hint = "Sets the width and height of the ring used for the imaginary axis, carved through c space.";
  11995.   
  11996.     }
  11997. }
  11998.  
  11999.  
  12000.